Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

open-axiom repository from github

24005 views
1
/*
2
Copyright (C) 1991-2002, The Numerical Algorithms Group Ltd.
3
All rights reserved.
4
Copyright (C) 2007-2010, Gabriel Dos Reis.
5
All rights reserved.
6
7
Redistribution and use in source and binary forms, with or without
8
modification, are permitted provided that the following conditions are
9
met:
10
11
- Redistributions of source code must retain the above copyright
12
notice, this list of conditions and the following disclaimer.
13
14
- Redistributions in binary form must reproduce the above copyright
15
notice, this list of conditions and the following disclaimer in
16
the documentation and/or other materials provided with the
17
distribution.
18
19
- Neither the name of The Numerical Algorithms Group Ltd. nor the
20
names of its contributors may be used to endorse or promote products
21
derived from this software without specific prior written permission.
22
23
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
24
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
25
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
26
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
27
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
28
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
29
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
*/
35
36
#define _VOLUME3D_C
37
#include "openaxiom-c-macros.h"
38
39
#include <math.h>
40
#include <string.h>
41
42
#include "header.h"
43
#include "cpanel.h"
44
#include "process.h"
45
#include "volume.h"
46
#include "../include/purty/volume.bitmap"
47
#include "../include/purty/volume.mask"
48
49
50
51
#include "XSpadFill.h"
52
#include "Gfun.H1"
53
#include "all_3d.H1"
54
55
#define eyeDistMessX (frusX(eyeWinX+27))
56
#define eyeDistMessY (frusY(eyeWinY-5))
57
#define hitherMessX (frusX(hitherWinX+15))
58
#define hitherMessY (frusY(hitherWinY))
59
60
#define clipXMessX (control->buttonQueue[clipXBut].buttonX + \
61
control->buttonQueue[clipXBut].xHalf)
62
#define clipXMessY (control->buttonQueue[clipXBut].buttonY + 2)
63
#define clipYMessX (control->buttonQueue[clipYBut].buttonX + \
64
control->buttonQueue[clipYBut].buttonWidth-2)
65
#define clipYMessY (control->buttonQueue[clipYBut].buttonY + \
66
control->buttonQueue[clipYBut].yHalf)
67
#define clipZMessX (control->buttonQueue[clipZBut].buttonX + \
68
control->buttonQueue[clipZBut].xHalf+4)
69
#define clipZMessY (control->buttonQueue[clipZBut].buttonY + \
70
control->buttonQueue[clipZBut].yHalf-4)
71
72
#define volumeCursorForeground monoColor(68)
73
#define volumeCursorBackground monoColor(197)
74
75
#define hitherBoxColor monoColor(141)
76
#define hitherBoxTop (frustrumMidY - 10)
77
#define hitherBoxHeight 20
78
79
#define clipButtonColor 144
80
#define toggleColor 42
81
#define arcColor 75
82
83
#define arcSize 6
84
#define tinyArc 5
85
#define blank 4
86
#define toggleX 190
87
#define toggleY 280
88
89
#define oldWay
90
91
#define frusX(x) (control->buttonQueue[frustrumBut].buttonX + x)
92
#define frusY(y) (control->buttonQueue[frustrumBut].buttonY + y)
93
94
#define clipMessX 7
95
#define clipMessY (control->buttonQueue[clipXBut].buttonY + 15)
96
/* someotherFont holds title font (see main.c) */
97
#define clipMessDy (globalFont->max_bounds.ascent/2 + \
98
globalFont->max_bounds.descent)
99
static const char* clipMess = "Clip Volume";
100
101
#define eyeMess1Dy clipMessDy
102
#define eyeMess1X 7
103
#define eyeMess1Y (frustrumY + 40 + 3*eyeMess1Dy)
104
static const char* eyeMess1 = "Eye";
105
106
#define eyeMess2X (globalFont->max_bounds.width + 14)
107
#define eyeMess2Y (frustrumY + 40)
108
#define eyeMess2Dy eyeMess1Dy
109
static const char* eyeMess2 = "Reference";
110
111
112
/* global stuff */
113
int flatClipBoxX[8], flatClipBoxY[8];
114
115
116
117
118
/******************* volume buttons **********************/
119
120
int
121
initVolumeButtons (buttonStruct *volumeButtons)
122
{
123
int ii, num = 0;
124
125
ii = volumeReturn;
126
volumeButtons[ii].buttonX = 154;
127
volumeButtons[ii].buttonY = 370;
128
volumeButtons[ii].buttonWidth = 110;
129
volumeButtons[ii].buttonHeight = 24;
130
volumeButtons[ii].buttonKey = ii;
131
volumeButtons[ii].pot = no;
132
volumeButtons[ii].mask = buttonMASK;
133
volumeButtons[ii].text = "Return";
134
volumeButtons[ii].textColor = 52;
135
volumeButtons[ii].xHalf = volumeButtons[ii].buttonWidth/2;
136
volumeButtons[ii].yHalf = volumeButtons[ii].buttonHeight/2;
137
++num;
138
139
ii = volumeAbort;
140
volumeButtons[ii].buttonX = 36;
141
volumeButtons[ii].buttonY = 370;
142
volumeButtons[ii].buttonWidth = 110;
143
volumeButtons[ii].buttonHeight = 24;
144
volumeButtons[ii].buttonKey = ii;
145
volumeButtons[ii].pot = no;
146
volumeButtons[ii].mask = buttonMASK;
147
volumeButtons[ii].text = "Abort";
148
volumeButtons[ii].textColor = 28;
149
volumeButtons[ii].xHalf = volumeButtons[ii].buttonWidth/2;
150
volumeButtons[ii].yHalf = volumeButtons[ii].buttonHeight/2;
151
++num;
152
153
ii = frustrumBut;
154
volumeButtons[ii].buttonX = frustrumWindowX;
155
volumeButtons[ii].buttonY = frustrumWindowY;
156
volumeButtons[ii].buttonWidth = frustrumWindowWidth;
157
volumeButtons[ii].buttonHeight = frustrumWindowHeight;
158
volumeButtons[ii].buttonKey = ii;
159
volumeButtons[ii].pot = yes;
160
volumeButtons[ii].mask = potMASK;
161
volumeButtons[ii].text = "Frustrum Window";
162
volumeButtons[ii].textColor = frustrumColor;
163
volumeButtons[ii].xHalf = volumeButtons[ii].buttonWidth/2;
164
volumeButtons[ii].yHalf = volumeButtons[ii].buttonHeight/2;
165
++num;
166
167
ii = perspectiveBut;
168
volumeButtons[ii].buttonX = toggleX;
169
volumeButtons[ii].buttonY = toggleY;
170
volumeButtons[ii].buttonWidth = 10;
171
volumeButtons[ii].buttonHeight = 10;
172
volumeButtons[ii].buttonKey = ii;
173
volumeButtons[ii].pot = no;
174
volumeButtons[ii].mask = potMASK;
175
volumeButtons[ii].text = "Perspective";
176
volumeButtons[ii].textColor = arcColor;
177
volumeButtons[ii].xHalf = volumeButtons[ii].buttonWidth/2;
178
volumeButtons[ii].yHalf = volumeButtons[ii].buttonHeight/2;
179
++num;
180
181
ii = clipRegionBut;
182
volumeButtons[ii].buttonX = toggleX;
183
volumeButtons[ii].buttonY = toggleY+20;
184
volumeButtons[ii].buttonWidth = 10;
185
volumeButtons[ii].buttonHeight = 10;
186
volumeButtons[ii].buttonKey = ii;
187
volumeButtons[ii].pot = no;
188
volumeButtons[ii].mask = potMASK;
189
volumeButtons[ii].text = "Show Region";
190
volumeButtons[ii].textColor = arcColor;
191
volumeButtons[ii].xHalf = volumeButtons[ii].buttonWidth/2;
192
volumeButtons[ii].yHalf = volumeButtons[ii].buttonHeight/2;
193
++num;
194
195
ii = clipSurfaceBut;
196
volumeButtons[ii].buttonX = toggleX;
197
volumeButtons[ii].buttonY = toggleY+40;
198
volumeButtons[ii].buttonWidth = 10;
199
volumeButtons[ii].buttonHeight = 10;
200
volumeButtons[ii].buttonKey = ii;
201
volumeButtons[ii].pot = no;
202
volumeButtons[ii].mask = potMASK;
203
volumeButtons[ii].text = "Clipping On";
204
volumeButtons[ii].textColor = arcColor;
205
volumeButtons[ii].xHalf = volumeButtons[ii].buttonWidth/2;
206
volumeButtons[ii].yHalf = volumeButtons[ii].buttonHeight/2;
207
++num;
208
209
ii = clipXBut;
210
volumeButtons[ii].buttonX = clipXButX;
211
volumeButtons[ii].buttonY = clipXButY;
212
volumeButtons[ii].buttonWidth = majorAxis;
213
volumeButtons[ii].buttonHeight = minorAxis;
214
volumeButtons[ii].buttonKey = ii;
215
volumeButtons[ii].pot = yes;
216
volumeButtons[ii].mask = potMASK;
217
volumeButtons[ii].text = "Clip X";
218
volumeButtons[ii].textColor = clipButtonColor;
219
volumeButtons[ii].xHalf = volumeButtons[ii].buttonWidth/2;
220
volumeButtons[ii].yHalf = volumeButtons[ii].buttonHeight/2;
221
++num;
222
223
ii = clipYBut;
224
volumeButtons[ii].buttonX = clipYButX;
225
volumeButtons[ii].buttonY = clipYButY;
226
volumeButtons[ii].buttonWidth = minorAxis;
227
volumeButtons[ii].buttonHeight = majorAxis;
228
volumeButtons[ii].buttonKey = ii;
229
volumeButtons[ii].pot = yes;
230
volumeButtons[ii].mask = potMASK;
231
volumeButtons[ii].text = "Clip Y";
232
volumeButtons[ii].textColor = clipButtonColor;
233
volumeButtons[ii].xHalf = volumeButtons[ii].buttonWidth/2;
234
volumeButtons[ii].yHalf = volumeButtons[ii].buttonHeight/2;
235
++num;
236
237
ii = clipZBut;
238
volumeButtons[ii].buttonX = clipZButX;
239
volumeButtons[ii].buttonY = clipZButY;
240
volumeButtons[ii].buttonWidth = midAxis;
241
volumeButtons[ii].buttonHeight = midAxis;
242
volumeButtons[ii].buttonKey = ii;
243
volumeButtons[ii].pot = yes;
244
volumeButtons[ii].mask = potMASK;
245
volumeButtons[ii].text = "Clip Z";
246
volumeButtons[ii].textColor = clipButtonColor;
247
volumeButtons[ii].xHalf = volumeButtons[ii].buttonWidth/2;
248
volumeButtons[ii].yHalf = volumeButtons[ii].buttonHeight/2;
249
++num;
250
251
return(num);
252
}
253
254
255
/*************************
256
* int makeVolumePanel() *
257
*************************/
258
259
void
260
makeVolumePanel (void)
261
{
262
263
int i;
264
XSetWindowAttributes cwAttrib, controlAttrib;
265
XSizeHints sizehint;
266
Pixmap volumebits, volumemask;
267
XColor foreColor, backColor;
268
269
volumebits = XCreateBitmapFromData(dsply,rtWindow,
270
(const char*) volumeBitmap_bits,
271
volumeBitmap_width,volumeBitmap_height);
272
volumemask = XCreateBitmapFromData(dsply,rtWindow,
273
(const char*) volumeMask_bits,
274
volumeMask_width,volumeMask_height);
275
cwAttrib.background_pixel = backgroundColor;
276
cwAttrib.border_pixel = foregroundColor;
277
cwAttrib.event_mask = volumeMASK;
278
cwAttrib.colormap = colorMap;
279
cwAttrib.override_redirect = overrideManager;
280
foreColor.pixel = volumeCursorForeground;
281
XQueryColor(dsply,colorMap,&foreColor);
282
backColor.pixel = volumeCursorBackground;
283
XQueryColor(dsply,colorMap,&backColor);
284
cwAttrib.cursor = XCreatePixmapCursor(dsply,volumebits,volumemask,
285
&foreColor,&backColor,
286
volumeBitmap_x_hot,
287
volumeBitmap_y_hot);
288
volumeWindow = XCreateWindow(dsply,control->controlWindow,
289
-3,-3,controlWidth,controlHeight,3,
290
CopyFromParent,InputOutput,CopyFromParent,
291
controlCreateMASK,&cwAttrib);
292
293
sizehint.flags = USPosition | USSize;
294
sizehint.x = 0;
295
sizehint.y = 0;
296
sizehint.width = controlWidth;
297
sizehint.height = controlHeight;
298
/*** the None stands for icon pixmap ***/
299
XSetNormalHints(dsply,volumeWindow,&sizehint);
300
XSetStandardProperties(dsply,volumeWindow,"Volume Panel 3D",
301
"View Volume",None,NULL,0,&sizehint);
302
303
/*** volume frustrum window ***/
304
305
/*** do volume buttons ***/
306
initVolumeButtons(control->buttonQueue);
307
for (i=volumeButtonsStart; i<(volumeButtonsEnd); i++) {
308
controlAttrib.event_mask = (control->buttonQueue[i]).mask;
309
(control->buttonQueue[i]).self =
310
XCreateWindow(dsply,volumeWindow,
311
(control->buttonQueue[i]).buttonX,
312
(control->buttonQueue[i]).buttonY,
313
(control->buttonQueue[i]).buttonWidth,
314
(control->buttonQueue[i]).buttonHeight,
315
0,0,InputOnly,CopyFromParent,
316
buttonCreateMASK,&controlAttrib);
317
XMakeAssoc(dsply,table,(control->buttonQueue[i]).self,
318
&((control->buttonQueue[i]).buttonKey));
319
XMapWindow(dsply,(control->buttonQueue[i]).self);
320
}
321
322
} /* makeVolumePanel() */
323
324
325
void
326
drawClipXBut (void)
327
{
328
329
XClearArea(dsply,volumeWindow,clipXButX,clipXButY,
330
majorAxis+blank,minorAxis+blank,False);
331
GSetForeground(trashGC,(float)monoColor(toggleColor),Xoption);
332
GDrawLine(trashGC,volumeWindow,
333
(control->buttonQueue[clipXBut]).buttonX,
334
(control->buttonQueue[clipXBut]).buttonY +
335
(control->buttonQueue[clipXBut]).yHalf,
336
(control->buttonQueue[clipXBut]).buttonX +
337
(control->buttonQueue[clipXBut]).buttonWidth,
338
(control->buttonQueue[clipXBut]).buttonY +
339
(control->buttonQueue[clipXBut]).yHalf,Xoption);
340
GDrawLine(trashGC,volumeWindow,
341
(control->buttonQueue[clipXBut]).buttonX-3,
342
(control->buttonQueue[clipXBut]).buttonY +
343
(control->buttonQueue[clipXBut]).yHalf-3,
344
(control->buttonQueue[clipXBut]).buttonX,
345
(control->buttonQueue[clipXBut]).buttonY +
346
(control->buttonQueue[clipXBut]).yHalf,Xoption);
347
GDrawLine(trashGC,volumeWindow,
348
(control->buttonQueue[clipXBut]).buttonX-3,
349
(control->buttonQueue[clipXBut]).buttonY +
350
(control->buttonQueue[clipXBut]).yHalf+3,
351
(control->buttonQueue[clipXBut]).buttonX,
352
(control->buttonQueue[clipXBut]).buttonY +
353
(control->buttonQueue[clipXBut]).yHalf,Xoption);
354
GDrawLine(trashGC,volumeWindow,
355
(control->buttonQueue[clipXBut]).buttonX +
356
(control->buttonQueue[clipXBut]).buttonWidth+3,
357
(control->buttonQueue[clipXBut]).buttonY +
358
(control->buttonQueue[clipXBut]).yHalf-3,
359
(control->buttonQueue[clipXBut]).buttonX +
360
(control->buttonQueue[clipXBut]).buttonWidth,
361
(control->buttonQueue[clipXBut]).buttonY +
362
(control->buttonQueue[clipXBut]).yHalf,Xoption);
363
GDrawLine(trashGC,volumeWindow,
364
(control->buttonQueue[clipXBut]).buttonX +
365
(control->buttonQueue[clipXBut]).buttonWidth+3,
366
(control->buttonQueue[clipXBut]).buttonY +
367
(control->buttonQueue[clipXBut]).yHalf+3,
368
(control->buttonQueue[clipXBut]).buttonX +
369
(control->buttonQueue[clipXBut]).buttonWidth,
370
(control->buttonQueue[clipXBut]).buttonY +
371
(control->buttonQueue[clipXBut]).yHalf,Xoption);
372
373
GSetForeground(trashGC,(float)monoColor(arcColor),Xoption);
374
GFillArc(trashGC,volumeWindow,
375
(int)(xClipMinN * (majorAxis-tinyArc) + clipXButX), /* x value */
376
(int)(clipXButY + minorAxis/2 + 1), /* y value */
377
arcSize,arcSize,0,360*64,Xoption); /* 64 units per degree */
378
GFillArc(trashGC,volumeWindow,
379
(int)(xClipMaxN * (majorAxis-tinyArc) + clipXButX), /* x value */
380
(int)(clipXButY + minorAxis/2 - 7), /* y value */
381
arcSize,arcSize,0,360*64,Xoption); /* 64 units per degree */
382
383
GSetForeground(volumeGC,(float)monoColor(toggleColor),Xoption);
384
GDrawString(volumeGC,volumeWindow,clipXMessX,clipXMessY,"X",1,Xoption);
385
386
}
387
388
void
389
drawClipYBut (void)
390
{
391
392
XClearArea(dsply,volumeWindow,clipYButX,clipYButY,
393
minorAxis+blank,majorAxis+blank,False);
394
GSetForeground(trashGC,(float)monoColor(toggleColor),Xoption);
395
GDrawLine(trashGC,volumeWindow,
396
(control->buttonQueue[clipYBut]).buttonX +
397
(control->buttonQueue[clipYBut]).xHalf,
398
(control->buttonQueue[clipYBut]).buttonY,
399
(control->buttonQueue[clipYBut]).buttonX +
400
(control->buttonQueue[clipYBut]).xHalf,
401
(control->buttonQueue[clipYBut]).buttonY +
402
(control->buttonQueue[clipYBut]).buttonHeight,Xoption);
403
GDrawLine(trashGC,volumeWindow,
404
(control->buttonQueue[clipYBut]).buttonX +
405
(control->buttonQueue[clipYBut]).xHalf-3,
406
(control->buttonQueue[clipYBut]).buttonY-3,
407
(control->buttonQueue[clipYBut]).buttonX +
408
(control->buttonQueue[clipYBut]).xHalf,
409
(control->buttonQueue[clipYBut]).buttonY,Xoption);
410
GDrawLine(trashGC,volumeWindow,
411
(control->buttonQueue[clipYBut]).buttonX +
412
(control->buttonQueue[clipYBut]).xHalf+3,
413
(control->buttonQueue[clipYBut]).buttonY-3,
414
(control->buttonQueue[clipYBut]).buttonX +
415
(control->buttonQueue[clipYBut]).xHalf,
416
(control->buttonQueue[clipYBut]).buttonY,Xoption);
417
GDrawLine(trashGC,volumeWindow,
418
(control->buttonQueue[clipYBut]).buttonX +
419
(control->buttonQueue[clipYBut]).xHalf-3,
420
(control->buttonQueue[clipYBut]).buttonY +
421
(control->buttonQueue[clipYBut]).buttonHeight+3,
422
(control->buttonQueue[clipYBut]).buttonX +
423
(control->buttonQueue[clipYBut]).xHalf,
424
(control->buttonQueue[clipYBut]).buttonY +
425
(control->buttonQueue[clipYBut]).buttonHeight,Xoption);
426
GDrawLine(trashGC,volumeWindow,
427
(control->buttonQueue[clipYBut]).buttonX +
428
(control->buttonQueue[clipYBut]).xHalf+3,
429
(control->buttonQueue[clipYBut]).buttonY +
430
(control->buttonQueue[clipYBut]).buttonHeight+3,
431
(control->buttonQueue[clipYBut]).buttonX +
432
(control->buttonQueue[clipYBut]).xHalf,
433
(control->buttonQueue[clipYBut]).buttonY +
434
(control->buttonQueue[clipYBut]).buttonHeight,Xoption);
435
436
GSetForeground(trashGC,(float)monoColor(arcColor),Xoption);
437
438
/* note: minimum buttons closer to the box */
439
GFillArc(trashGC,volumeWindow,
440
(int)(clipYButX + minorAxis/2 - 8),
441
(int)(yClipMinN * (majorAxis-tinyArc) + clipYButY),
442
arcSize,arcSize,90*64,360*64,Xoption); /* 64 units per degree */
443
GFillArc(trashGC,volumeWindow,
444
(int)(clipYButX + minorAxis/2 + 3),
445
(int)(yClipMaxN * (majorAxis-tinyArc) + clipYButY),
446
arcSize,arcSize,90*64,360*64,Xoption); /* 64 units per degree */
447
448
GSetForeground(volumeGC,(float)monoColor(toggleColor),Xoption);
449
GDrawString(volumeGC,volumeWindow,clipYMessX,clipYMessY,"Y",1,Xoption);
450
451
}
452
453
454
void
455
drawClipZBut (void)
456
{
457
458
XClearArea(dsply,volumeWindow,clipZButX,clipZButY,
459
midAxis+blank,midAxis+blank,False);
460
GSetForeground(trashGC,(float)monoColor(toggleColor),Xoption);
461
GDrawLine(trashGC,volumeWindow,clipZButTopEndX,clipZButTopEndY,
462
clipZButBotEndX,clipZButBotEndY,Xoption);
463
GDrawLine(trashGC,volumeWindow,clipZButTopEndX-4,clipZButTopEndY,
464
clipZButTopEndX,clipZButTopEndY,Xoption);
465
466
GDrawLine(trashGC,volumeWindow,clipZButTopEndX,clipZButTopEndY-4,
467
clipZButTopEndX,clipZButTopEndY,Xoption);
468
469
GDrawLine(trashGC,volumeWindow,clipZButBotEndX+4,clipZButBotEndY,
470
clipZButBotEndX,clipZButBotEndY,Xoption);
471
472
GDrawLine(trashGC,volumeWindow,clipZButBotEndX,clipZButBotEndY+4,
473
clipZButBotEndX,clipZButBotEndY,Xoption);
474
475
476
GSetForeground(trashGC,(float)monoColor(arcColor),Xoption);
477
GFillArc(trashGC,volumeWindow,
478
(int)(zClipMinN * midAxis * zFactor + clipZButTopEndX - 3),
479
(int)(zClipMinN * midAxis * zFactor + clipZButTopEndY + 3),
480
arcSize,arcSize,45*64,360*64,Xoption); /* 64 units per degree */
481
GFillArc(trashGC,volumeWindow,
482
(int)(zClipMaxN * midAxis * zFactor + clipZButTopEndX + 3),
483
(int)(zClipMaxN * midAxis * zFactor + clipZButTopEndY - 5),
484
arcSize,arcSize,45*64,360*64,Xoption); /* 64 units per degree */
485
486
GSetForeground(volumeGC,(float)monoColor(toggleColor),Xoption);
487
GDrawString(volumeGC,volumeWindow,clipZMessX,clipZMessY,"Z",1,Xoption);
488
489
}
490
491
492
void
493
drawClipVolume (void)
494
{
495
496
float xminL,xmaxL,yminL,ymaxL,zminL,zmaxL;
497
498
XClearArea(dsply,volumeWindow,backFaceX-1,backFaceY,
499
lengthFace+deltaFace+2,lengthFace+deltaFace+1,False);
500
501
GSetForeground(trashGC,(float)boxInline,Xoption); /*boxOutline=133*/
502
GSetLineAttributes(trashGC,0,LineSolid,CapButt,JoinMiter,Xoption);
503
504
/* define corners of volume, clockwise, back to front */
505
xminL = xClipMinN*lengthFace;
506
xmaxL = xClipMaxN*lengthFace;
507
yminL = yClipMinN*lengthFace;
508
ymaxL = yClipMaxN*lengthFace;
509
zminL = zClipMinN*zLength;
510
zmaxL = (1-zClipMaxN)*zLength; /* percentage upwards from bottom */
511
512
flatClipBoxX[0] = backFaceX + xminL + zminL;
513
flatClipBoxY[0] = backFaceY + yminL + zminL;
514
flatClipBoxX[1] = backFaceX + xmaxL + zminL;
515
flatClipBoxY[1] = flatClipBoxY[0];
516
flatClipBoxX[2] = flatClipBoxX[1];
517
flatClipBoxY[2] = backFaceY + ymaxL + zminL;
518
flatClipBoxX[3] = flatClipBoxX[0];
519
flatClipBoxY[3] = flatClipBoxY[2];
520
flatClipBoxX[4] = frontFaceX + xminL - zmaxL;
521
flatClipBoxY[4] = frontFaceY + yminL - zmaxL;
522
flatClipBoxX[5] = frontFaceX + xmaxL - zmaxL;
523
flatClipBoxY[5] = flatClipBoxY[4];
524
flatClipBoxX[6] = flatClipBoxX[5];
525
flatClipBoxY[6] = frontFaceY + ymaxL - zmaxL;
526
flatClipBoxX[7] = flatClipBoxX[4];
527
flatClipBoxY[7] = flatClipBoxY[6];
528
529
/* now draw the volume */
530
GDrawRectangle(trashGC,volumeWindow,
531
flatClipBoxX[0],flatClipBoxY[0],
532
flatClipBoxX[2]-flatClipBoxX[0],
533
flatClipBoxY[2]-flatClipBoxY[0],Xoption);
534
GDrawLine(trashGC,volumeWindow,
535
flatClipBoxX[0],flatClipBoxY[0],flatClipBoxX[4],flatClipBoxY[4],Xoption);
536
GDrawLine(trashGC,volumeWindow,
537
flatClipBoxX[1],flatClipBoxY[1],flatClipBoxX[5],flatClipBoxY[5],Xoption);
538
GDrawLine(trashGC,volumeWindow,
539
flatClipBoxX[2],flatClipBoxY[2],flatClipBoxX[6],flatClipBoxY[6],Xoption);
540
GDrawLine(trashGC,volumeWindow,
541
flatClipBoxX[3],flatClipBoxY[3],flatClipBoxX[7],flatClipBoxY[7],Xoption);
542
GSetForeground(trashGC,(float)boxOutline,Xoption);
543
GDrawRectangle(trashGC,volumeWindow,
544
flatClipBoxX[4],flatClipBoxY[4],
545
flatClipBoxX[6]-flatClipBoxX[4],
546
flatClipBoxY[6]-flatClipBoxY[4],Xoption);
547
/* make sure volumeGC is set properly before calling these functions */
548
549
} /* drawClipVolume() */
550
551
552
void
553
drawHitherControl (void)
554
{
555
556
float xx,b,slope;
557
int hitherTop, hitherBot;
558
559
float b0x,b1x;
560
561
/* draw box indicating minimum and maximum distance of projection */
562
GSetForeground(trashGC,(float)hitherBoxColor,Xoption);
563
b0x = (pzMin - clipPlaneMin)/(clipPlaneMax-clipPlaneMin);
564
b0x = hitherMaxX - b0x*(hitherMaxX - hitherMinX); /* screen x */
565
b1x = (pzMax - clipPlaneMin)/(clipPlaneMax-clipPlaneMin);
566
b1x = hitherMaxX - b1x*(hitherMaxX - hitherMinX); /* screen x */
567
GDraw3DButtonOut(trashGC,volumeWindow,
568
(int)(b0x),frusY(hitherBoxTop),
569
(int)fabs(b1x-b0x),hitherBoxHeight,Xoption);
570
571
/* draw the hither plane */
572
GSetForeground(trashGC,(float)hitherColor,Xoption);
573
574
/* percentage x */
575
xx = ((viewData.clipPlane-clipPlaneMin)/(clipPlaneMax-clipPlaneMin));
576
xx = hitherMaxX - xx*(hitherMaxX - hitherMinX); /* screen x */
577
slope = ((float)frustrumY - frustrumMidY)/(frustrumX - frustrumVertex);
578
b = ((float)frustrumX*frustrumMidY - frustrumVertex*frustrumY) /
579
(frustrumX - frustrumVertex);
580
hitherTop = slope * xx + b + 0.5;
581
slope = (float)(frustrumBotY - frustrumMidY)/(frustrumX - frustrumVertex);
582
b = ((float)frustrumX*frustrumMidY - frustrumVertex*frustrumBotY) /
583
(frustrumX - frustrumVertex);
584
hitherBot = slope * xx + b + 0.5;
585
GDrawLine(trashGC,volumeWindow, frusX((int)xx),frusY(hitherTop),
586
frusX((int)xx),frusY(hitherBot),Xoption);
587
588
/* draw hither control box and bar */
589
GDraw3DButtonOut(trashGC,volumeWindow,
590
frusX(hitherWinX),frusY(hitherWinY+5),
591
hitherWidth,hitherHeight,Xoption);
592
GDrawLine(trashGC,volumeWindow,
593
frusX(hitherMinX),frusY(hitherBarY+5),
594
frusX(hitherMaxX),frusY(hitherBarY+5),Xoption);
595
/* draw hither plane I/O pointer arrow */
596
597
GDrawLine(trashGC,volumeWindow,
598
frusX((int)xx),frusY(hitherBarY+2),
599
frusX((int)xx),frusY(hitherBarY+8),Xoption);
600
601
/* print string label */
602
GSetForeground(volumeGC,(float)hitherColor,Xoption);
603
GDrawString(volumeGC,volumeWindow,hitherMessX,hitherMessY,"Hither",6,Xoption);
604
605
}
606
607
void
608
drawEyeControl (void)
609
{
610
611
float here;
612
int there;
613
614
GSetForeground(trashGC,(float)eyeColor,Xoption);
615
616
/* draw the eyeDistance box & slide bar */
617
GDraw3DButtonOut(trashGC,volumeWindow,
618
frusX(eyeWinX),frusY(eyeWinY+5),eyeWidth,eyeHeight,Xoption);
619
GDrawLine(trashGC,volumeWindow,
620
frusX(eyeMinX),frusY(eyeBarY+5),frusX(eyeMaxX),frusY(eyeBarY+5),Xoption);
621
here = (viewData.eyeDistance - minEyeDistance) /
622
(maxEyeDistance - minEyeDistance);
623
here = pow((double)here,0.333333);
624
there = here * (eyeMaxX - eyeMinX) + eyeMinX; /* screen x */
625
GDrawLine(trashGC,volumeWindow,
626
frusX(there),frusY(eyeBarY+2),frusX(there),frusY(eyeBarY+8),Xoption);
627
628
/* draw the eye */
629
GSetLineAttributes(trashGC,2,LineSolid,CapButt,JoinMiter,Xoption);
630
GSetForeground(trashGC,(float)monoColor(52),Xoption);
631
GDrawLine(trashGC,volumeWindow,
632
frusX(there),frusY(frustrumMidY-5),
633
frusX(there+8),frusY(frustrumMidY),Xoption);
634
GDrawLine(trashGC,volumeWindow,
635
frusX(there+2),frusY(frustrumMidY+4),
636
frusX(there+8),frusY(frustrumMidY-1),Xoption);
637
GSetForeground(trashGC,(float)frustrumColor,Xoption);
638
GDrawLine(trashGC,volumeWindow,
639
frusX(there+4),frusY(frustrumMidY-3),
640
frusX(there+2),frusY(frustrumMidY),Xoption);
641
GDrawLine(trashGC,volumeWindow,
642
frusX(there+4),frusY(frustrumMidY+2),
643
frusX(there+3),frusY(frustrumMidY),Xoption);
644
GSetLineAttributes(trashGC,0,LineSolid,CapButt,JoinMiter,Xoption);
645
646
/* draw string label */
647
GSetForeground(volumeGC,(float)eyeColor,Xoption);
648
GDrawString(volumeGC,volumeWindow,eyeDistMessX,eyeDistMessY,
649
"Eye Distance",strlen("eye distance"),Xoption);
650
651
}
652
653
654
/**************************
655
* void drawFrustrum() *
656
**************************/
657
658
void
659
drawFrustrum (void)
660
{
661
662
float normalizedEyeDistance;
663
664
XClearArea(dsply,volumeWindow,
665
control->buttonQueue[frustrumBut].buttonX,
666
control->buttonQueue[frustrumBut].buttonY,
667
control->buttonQueue[frustrumBut].buttonWidth+9,
668
control->buttonQueue[frustrumBut].buttonHeight,False);
669
GSetForeground(trashGC,(float)frustrumColor,Xoption);
670
normalizedEyeDistance = (viewData.eyeDistance - minEyeDistance) /
671
(maxEyeDistance - minEyeDistance);
672
normalizedEyeDistance = pow((double)normalizedEyeDistance,0.333333333);
673
frustrumVertex = normalizedEyeDistance * (frustrumMax - frustrumMin) +
674
frustrumMin - 4;
675
GDrawLine(trashGC,volumeWindow,
676
frusX(frustrumX),frusY(frustrumY),
677
frusX(frustrumX),frusY(frustrumY+frustrumLength),Xoption);
678
GDrawLine(trashGC,volumeWindow,
679
frusX(frustrumX),frusY(frustrumY),
680
frusX(frustrumVertex),frusY(frustrumMidY),Xoption);
681
GDrawLine(trashGC,volumeWindow,
682
frusX(frustrumX),frusY(frustrumBotY),
683
frusX(frustrumVertex),frusY(frustrumMidY),Xoption);
684
685
/* draw controls */
686
drawHitherControl();
687
drawEyeControl();
688
689
} /* drawFrustrum() */
690
691
692
693
/**************************
694
* void drawVolumePanel() *
695
**************************/
696
697
void
698
drawVolumePanel (void)
699
{
700
701
int i,strlength;
702
703
704
/* Draw some lines for volume panel. */
705
GSetForeground(trashGC,(float)foregroundColor,Xoption);
706
GSetLineAttributes(trashGC,3,LineSolid,CapButt,JoinMiter,Xoption);
707
GDrawLine(trashGC, volumeWindow, 0, potA, controlWidth, potA, Xoption);
708
709
GSetLineAttributes(trashGC,2,LineSolid,CapButt,JoinMiter,Xoption);
710
GDrawLine(trashGC, volumeWindow, 0, volumeTitleA, controlWidth,
711
volumeTitleA, Xoption);
712
GDrawLine(trashGC, volumeWindow, 0, volumeTitleB, controlWidth,
713
volumeTitleB, Xoption);
714
715
writeControlTitle(volumeWindow);
716
s = "Viewing Volume Panel";
717
strlength = strlen(s);
718
GSetForeground(anotherGC,(float)volumeTitleColor,Xoption);
719
GDrawString(anotherGC,volumeWindow,
720
centerX(anotherGC,s,strlength,controlWidth),
721
volumeTitleA+18,s,strlength,Xoption);
722
723
GSetForeground(anotherGC,(float)monoColor(toggleColor),Xoption);
724
GDrawString(anotherGC,volumeWindow,
725
control->buttonQueue[perspectiveBut].buttonX + 4,
726
control->buttonQueue[perspectiveBut].buttonY - 17,
727
"Settings", 8, Xoption);
728
729
GSetForeground(trashGC,(float)monoColor(toggleColor),Xoption);
730
GDraw3DButtonOut(trashGC,volumeWindow,
731
control->buttonQueue[perspectiveBut].buttonX - 7,
732
control->buttonQueue[perspectiveBut].buttonY - 36,
733
100,100,Xoption);
734
735
736
for (i=0; i<strlen(clipMess); i++)
737
GDrawString(trashGC,volumeWindow,clipMessX,clipMessY + i*clipMessDy,
738
&(clipMess[i]),1,Xoption);
739
for (i=0; i<strlen(eyeMess1); i++)
740
GDrawString(trashGC,volumeWindow,eyeMess1X,eyeMess1Y + i*eyeMess1Dy,
741
&(eyeMess1[i]),1,Xoption);
742
for (i=0; i<strlen(eyeMess2); i++)
743
GDrawString(trashGC,volumeWindow,eyeMess2X,eyeMess2Y + i*eyeMess2Dy,
744
&(eyeMess2[i]),1,Xoption);
745
746
GSetLineAttributes(trashGC,0,LineSolid,CapButt,JoinMiter,Xoption);
747
GSetForeground(trashGC,(float)volumeButtonColor,Xoption);
748
for (i=volumeButtonsStart; i<(volumeButtonsEnd); i++) {
749
GSetForeground(trashGC,
750
(float)monoColor((control->buttonQueue[i]).textColor),Xoption);
751
switch (i) {
752
case perspectiveBut:
753
case clipRegionBut:
754
case clipSurfaceBut:
755
GSetForeground(volumeGC,(float)monoColor(toggleColor),Xoption);
756
GDraw3DButtonOut(volumeGC,volumeWindow,
757
(control->buttonQueue[i]).buttonX,
758
(control->buttonQueue[i]).buttonY,
759
(control->buttonQueue[i]).buttonWidth,
760
(control->buttonQueue[i]).buttonHeight,Xoption);
761
GSetForeground(volumeGC,
762
(float)monoColor((control->buttonQueue[i]).textColor),Xoption);
763
GDrawString(volumeGC,volumeWindow,
764
(control->buttonQueue[i]).buttonX +
765
(control->buttonQueue[i]).buttonWidth + 4,
766
(control->buttonQueue[i]).buttonY +
767
centerY(volumeGC,(control->buttonQueue[i]).buttonHeight),
768
(control->buttonQueue[i]).text,
769
strlen(control->buttonQueue[i].text),Xoption);
770
if (i==perspectiveBut && viewData.perspective)
771
GDrawString(volumeGC,volumeWindow,
772
(control->buttonQueue[i]).buttonX +
773
centerX(volumeGC,"x",1,
774
(control->buttonQueue[i]).buttonWidth),
775
(control->buttonQueue[i]).buttonY +
776
centerY(volumeGC,(control->buttonQueue[i]).buttonHeight),
777
"x",1,Xoption);
778
else if (i==clipRegionBut && viewData.clipbox)
779
GDrawString(volumeGC,volumeWindow,
780
(control->buttonQueue[i]).buttonX +
781
centerX(volumeGC,"x",1,
782
(control->buttonQueue[i]).buttonWidth),
783
(control->buttonQueue[i]).buttonY +
784
centerY(volumeGC,(control->buttonQueue[i]).buttonHeight),
785
"x",1,Xoption);
786
else if (i==clipSurfaceBut && viewData.clipStuff)
787
GDrawString(volumeGC,volumeWindow,
788
(control->buttonQueue[i]).buttonX +
789
centerX(volumeGC,"x",1,
790
(control->buttonQueue[i]).buttonWidth),
791
(control->buttonQueue[i]).buttonY +
792
centerY(volumeGC,(control->buttonQueue[i]).buttonHeight),
793
"x",1,Xoption);
794
795
break;
796
797
case clipXBut:
798
drawClipXBut();
799
break;
800
801
case clipYBut:
802
drawClipYBut();
803
break;
804
805
case clipZBut:
806
drawClipZBut();
807
break;
808
809
case frustrumBut:
810
break;
811
812
default:
813
GDraw3DButtonOut(trashGC,volumeWindow,
814
(control->buttonQueue[i]).buttonX,
815
(control->buttonQueue[i]).buttonY,
816
(control->buttonQueue[i]).buttonWidth,
817
(control->buttonQueue[i]).buttonHeight,Xoption);
818
s = (control->buttonQueue[i]).text;
819
strlength = strlen(s);
820
GSetForeground(trashGC,
821
(float)monoColor((control->buttonQueue[i]).textColor),Xoption);
822
GDrawString(trashGC,volumeWindow,
823
(control->buttonQueue[i]).buttonX +
824
centerX(processGC,s,strlength,
825
(control->buttonQueue[i]).buttonWidth),
826
(control->buttonQueue[i]).buttonY +
827
centerY(processGC,(control->buttonQueue[i]).buttonHeight),
828
s,strlen(s),Xoption);
829
} /* switch */
830
} /* for i in volumeButtons */
831
832
drawFrustrum();
833
drawClipVolume(); /*** put in header ***/
834
drawClipXBut();
835
drawClipYBut();
836
drawClipZBut();
837
838
} /* drawVolumePanel() */
839
840
841
842