Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/post/src/glaux/glaux.c
3203 views
1
/* aux.c */
2
3
4
#include <stdio.h>
5
#include <stdlib.h>
6
#include <string.h>
7
8
#if !defined(AMIGA) && !defined(__WIN32__)
9
#include <X11/Xlib.h>
10
#include <X11/Xutil.h>
11
#include <X11/keysym.h>
12
#endif
13
14
#include <GL/gl.h>
15
16
#include "../tk/tk.h"
17
#include "glaux.h"
18
19
#if defined(__cplusplus) || defined(c_plusplus)
20
#define class c_class
21
#endif
22
23
24
static struct {
25
int keyField;
26
void (*KeyFunc)(void);
27
} keyTable[200];
28
29
static struct {
30
int mouseField;
31
void (*MouseFunc)(AUX_EVENTREC *);
32
} mouseDownTable[20], mouseUpTable[20], mouseLocTable[20];
33
34
static int keyTableCount = 0;
35
static int mouseDownTableCount = 0;
36
static int mouseUpTableCount = 0;
37
static int mouseLocTableCount = 0;
38
static GLenum displayModeType = 0;
39
static GLenum displayModePolicy = 0; /* AUX_MINIMUM_CRITERIA; */
40
static int displayModeID = 0;
41
42
static int animate = 0;
43
44
45
#ifdef __WIN32__
46
#define NCOLORS 17
47
float auxRGBMap[NCOLORS][3] = {
48
{0,0,0},
49
{0,0,0},
50
{0,0,0},
51
{0,0,0},
52
{0,0,0},
53
{0,0,0},
54
{0,0,0},
55
{0,0,0},
56
{0,0,0},
57
{0,0,0},
58
{1,0,0},
59
{0,1,0},
60
{1,1,0},
61
{0,0,1},
62
{1,0,1},
63
{0,1,1},
64
{1,1,1}
65
};
66
#endif
67
68
69
static void DefaultHandleReshape(int w, int h)
70
{
71
glViewport(0, 0, w, h);
72
glMatrixMode(GL_PROJECTION);
73
glLoadIdentity();
74
glOrtho(0.0, (GLdouble)w, 0.0, (GLdouble)h, -1.0, 1.0);
75
glMatrixMode(GL_MODELVIEW);
76
glLoadIdentity();
77
}
78
79
static void DefaultHandleExpose(int w, int h)
80
{
81
}
82
83
static GLenum MouseLoc(int x, int y, GLenum button)
84
{
85
AUX_EVENTREC info;
86
GLenum flag;
87
int i;
88
89
flag = GL_FALSE;
90
for (i = 0; i < mouseLocTableCount; i++) {
91
if ((button & AUX_LEFTBUTTON) == mouseLocTable[i].mouseField) {
92
info.event = AUX_MOUSELOC;
93
info.data[AUX_MOUSEX] = x;
94
info.data[AUX_MOUSEY] = y;
95
info.data[AUX_MOUSESTATUS] = AUX_LEFTBUTTON;
96
(*mouseLocTable[i].MouseFunc)(&info);
97
flag |= GL_TRUE;
98
}
99
if ((button & AUX_RIGHTBUTTON) == mouseLocTable[i].mouseField) {
100
info.event = AUX_MOUSELOC;
101
info.data[AUX_MOUSEX] = x;
102
info.data[AUX_MOUSEY] = y;
103
info.data[AUX_MOUSESTATUS] = AUX_RIGHTBUTTON;
104
(*mouseLocTable[i].MouseFunc)(&info);
105
flag |= GL_TRUE;
106
}
107
if ((button & AUX_MIDDLEBUTTON) == mouseLocTable[i].mouseField) {
108
info.event = AUX_MOUSELOC;
109
info.data[AUX_MOUSEX] = x;
110
info.data[AUX_MOUSEY] = y;
111
info.data[AUX_MOUSESTATUS] = AUX_MIDDLEBUTTON;
112
(*mouseLocTable[i].MouseFunc)(&info);
113
flag |= GL_TRUE;
114
}
115
}
116
return flag;
117
}
118
119
static GLenum MouseUp(int x, int y, GLenum button)
120
{
121
AUX_EVENTREC info;
122
GLenum flag;
123
int i;
124
125
flag = GL_FALSE;
126
for (i = 0; i < mouseUpTableCount; i++) {
127
if ((button & AUX_LEFTBUTTON) == mouseUpTable[i].mouseField) {
128
info.event = AUX_MOUSEUP;
129
info.data[AUX_MOUSEX] = x;
130
info.data[AUX_MOUSEY] = y;
131
info.data[AUX_MOUSESTATUS] = AUX_LEFTBUTTON;
132
(*mouseUpTable[i].MouseFunc)(&info);
133
flag |= GL_TRUE;
134
}
135
if ((button & AUX_RIGHTBUTTON) == mouseUpTable[i].mouseField) {
136
info.event = AUX_MOUSEUP;
137
info.data[AUX_MOUSEX] = x;
138
info.data[AUX_MOUSEY] = y;
139
info.data[AUX_MOUSESTATUS] = AUX_RIGHTBUTTON;
140
(*mouseUpTable[i].MouseFunc)(&info);
141
flag |= GL_TRUE;
142
}
143
if ((button & AUX_MIDDLEBUTTON) == mouseUpTable[i].mouseField) {
144
info.event = AUX_MOUSEUP;
145
info.data[AUX_MOUSEX] = x;
146
info.data[AUX_MOUSEY] = y;
147
info.data[AUX_MOUSESTATUS] = AUX_MIDDLEBUTTON;
148
(*mouseUpTable[i].MouseFunc)(&info);
149
flag |= GL_TRUE;
150
}
151
}
152
return flag;
153
}
154
155
static GLenum MouseDown(int x, int y, GLenum button)
156
{
157
AUX_EVENTREC info;
158
GLenum flag;
159
int i;
160
161
flag = GL_FALSE;
162
for (i = 0; i < mouseDownTableCount; i++) {
163
if ((button & AUX_LEFTBUTTON) == mouseDownTable[i].mouseField) {
164
info.event = AUX_MOUSEDOWN;
165
info.data[AUX_MOUSEX] = x;
166
info.data[AUX_MOUSEY] = y;
167
info.data[AUX_MOUSESTATUS] = AUX_LEFTBUTTON;
168
(*mouseDownTable[i].MouseFunc)(&info);
169
flag |= GL_TRUE;
170
}
171
if ((button & AUX_RIGHTBUTTON) == mouseDownTable[i].mouseField) {
172
info.event = AUX_MOUSEDOWN;
173
info.data[AUX_MOUSEX] = x;
174
info.data[AUX_MOUSEY] = y;
175
info.data[AUX_MOUSESTATUS] = AUX_RIGHTBUTTON;
176
(*mouseDownTable[i].MouseFunc)(&info);
177
flag |= GL_TRUE;
178
}
179
if ((button & AUX_MIDDLEBUTTON) == mouseDownTable[i].mouseField) {
180
info.event = AUX_MOUSEDOWN;
181
info.data[AUX_MOUSEX] = x;
182
info.data[AUX_MOUSEY] = y;
183
info.data[AUX_MOUSESTATUS] = AUX_MIDDLEBUTTON;
184
(*mouseDownTable[i].MouseFunc)(&info);
185
flag |= GL_TRUE;
186
}
187
}
188
return flag;
189
}
190
191
static GLenum KeyDown(int key, GLenum status)
192
{
193
GLenum flag;
194
int i;
195
196
flag = GL_FALSE;
197
if (keyTableCount) {
198
for (i = 0; i < keyTableCount; i++) {
199
if (key == keyTable[i].keyField) {
200
(*keyTable[i].KeyFunc)();
201
flag |= GL_TRUE;
202
}
203
}
204
}
205
return flag;
206
}
207
208
void auxExposeFunc(void (*Func)(int, int))
209
{
210
tkExposeFunc(Func);
211
}
212
213
void auxReshapeFunc(void (*Func)(int, int))
214
{
215
tkExposeFunc(Func);
216
tkReshapeFunc(Func);
217
}
218
219
void auxIdleFunc(void (*Func)(void))
220
{
221
tkIdleFunc(Func);
222
}
223
224
void auxKeyFunc(int key, void (*Func)(void))
225
{
226
keyTable[keyTableCount].keyField = key;
227
keyTable[keyTableCount++].KeyFunc = Func;
228
}
229
230
void auxMouseFunc(int mouse, int mode, void (*Func)(AUX_EVENTREC *))
231
{
232
if (mode == AUX_MOUSEDOWN) {
233
mouseDownTable[mouseDownTableCount].mouseField = mouse;
234
mouseDownTable[mouseDownTableCount++].MouseFunc = Func;
235
} else if (mode == AUX_MOUSEUP) {
236
mouseUpTable[mouseUpTableCount].mouseField = mouse;
237
mouseUpTable[mouseUpTableCount++].MouseFunc = Func;
238
} else if (mode == AUX_MOUSELOC) {
239
mouseLocTable[mouseLocTableCount].mouseField = mouse;
240
mouseLocTable[mouseLocTableCount++].MouseFunc = Func;
241
}
242
}
243
244
245
void auxDeleteMouseFunc( int mouse, int mode, void (*Func)(AUX_EVENTREC *))
246
{
247
int i, j;
248
249
for (i=0;i<mouseLocTableCount;i++) {
250
if (mouseLocTable[i].MouseFunc == Func) {
251
/* delete this one */
252
for (j=i+1;j<mouseLocTableCount;j++) {
253
mouseLocTable[j-1].MouseFunc = mouseLocTable[j].MouseFunc;
254
mouseLocTable[j-1].mouseField = mouseLocTable[j].mouseField;
255
}
256
mouseLocTableCount--;
257
break;
258
}
259
}
260
261
}
262
263
264
static void idle(void)
265
{
266
/* do nothing */
267
}
268
269
void auxMainLoop(void (*Func)(void))
270
{
271
if (animate) {
272
auxIdleFunc( idle );
273
}
274
275
tkDisplayFunc(Func);
276
tkExec(1);
277
}
278
279
void auxInitPosition(int x, int y, int width, int height)
280
{
281
tkInitPosition(x, y, width, height);
282
}
283
284
void auxInitDisplayMode(GLenum type)
285
{
286
displayModeType = type;
287
tkInitDisplayMode(type);
288
}
289
290
void auxInitDisplayModePolicy(GLenum type)
291
{
292
293
displayModePolicy = type;
294
/* tkInitDisplayModePolicy(type);*/
295
}
296
297
GLenum auxInitDisplayModeID(GLint id)
298
{
299
300
displayModeID = id;
301
/* tkInitDisplayModeID(id);*/
302
}
303
304
GLenum auxInitWindow(char *title)
305
{
306
int useDoubleAsSingle = 0;
307
308
if (tkInitWindow(title) == GL_FALSE) {
309
if (AUX_WIND_IS_SINGLE(displayModeType)) {
310
tkInitDisplayMode(displayModeType|AUX_DOUBLE);
311
if (tkInitWindow(title) == GL_FALSE) {
312
return GL_FALSE;
313
}
314
fprintf(stderr, "Can't initialize a single buffer visual.\n");
315
fprintf(stderr, "Will use a double buffer visual instead,");
316
fprintf(stderr, "only drawing into the front buffer.\n");
317
displayModeType = displayModeType | AUX_DOUBLE;
318
useDoubleAsSingle = 1;
319
}
320
}
321
tkReshapeFunc(DefaultHandleReshape);
322
tkExposeFunc(DefaultHandleExpose);
323
tkMouseUpFunc(MouseUp);
324
tkMouseDownFunc(MouseDown);
325
tkMouseMoveFunc(MouseLoc);
326
tkKeyDownFunc(KeyDown);
327
auxKeyFunc(AUX_ESCAPE, auxQuit);
328
glClearColor(0.0, 0.0, 0.0, 1.0);
329
glClearIndex(0);
330
glLoadIdentity();
331
if (useDoubleAsSingle) {
332
glReadBuffer(GL_FRONT);
333
glDrawBuffer(GL_FRONT);
334
}
335
return GL_TRUE;
336
}
337
338
void auxCloseWindow(void)
339
{
340
tkCloseWindow();
341
keyTableCount = 0;
342
mouseDownTableCount = 0;
343
mouseUpTableCount = 0;
344
mouseLocTableCount = 0;
345
}
346
347
void auxQuit(void)
348
{
349
tkQuit();
350
}
351
352
void auxSwapBuffers(void)
353
{
354
tkSwapBuffers();
355
}
356
357
#if !defined(AMIGA) && !defined(__WIN32__)
358
/* for systems with X only... */
359
Display *auxXDisplay(void)
360
{
361
Display *ptr;
362
363
tkGetSystem(TK_X_DISPLAY, (void *)&ptr);
364
return ptr;
365
}
366
367
Window auxXWindow(void)
368
{
369
Window ptr;
370
371
tkGetSystem(TK_X_WINDOW, (void *)&ptr);
372
return ptr;
373
}
374
#endif
375
376
GLenum auxGetDisplayModePolicy(void)
377
{
378
return displayModePolicy;
379
/* return tkGetDisplayModePolicy();*/
380
}
381
382
GLint auxGetDisplayModeID(void)
383
{
384
/* return tkGetDisplayModeID();*/
385
return displayModeID;
386
}
387
388
GLenum auxGetDisplayMode(void)
389
{
390
/* return tkGetDisplayMode();*/
391
return displayModeType;
392
}
393
394
void auxSetOneColor(int index, float r, float g, float b)
395
{
396
tkSetOneColor(index, r, g, b);
397
}
398
399
void auxSetFogRamp(int density, int startIndex)
400
{
401
tkSetFogRamp(density, startIndex);
402
}
403
404
void auxSetGreyRamp(void)
405
{
406
tkSetGreyRamp();
407
}
408
409
void auxSetRGBMap(int size, float *rgb)
410
{
411
tkSetRGBMap(size, rgb);
412
}
413
414
int auxGetColorMapSize(void)
415
{
416
417
return tkGetColorMapSize();;
418
}
419
420
void auxGetMouseLoc(int *x, int *y)
421
{
422
tkGetMouseLoc(x, y);
423
}
424
425
void auxGetScreenSize( GLint *width, GLint *height )
426
{
427
/* This is a kludge! */
428
*width = 1280;
429
*height = 1024;
430
}
431
432
433
void auxAnimation( GLint state )
434
{
435
animate = state;
436
}
437
438
439