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-2008, 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 _SPADACTION3D_C
37
#include "openaxiom-c-macros.h"
38
39
#include <unistd.h>
40
#include <stdio.h>
41
#include <string.h>
42
43
#include "header.h"
44
#include "process.h"
45
#include "draw.h"
46
47
#include "util.H1"
48
#include "all_3d.H1"
49
50
int
51
readViewman (void *info,int size)
52
{
53
int m = 0;
54
55
sprintf(errorStr,"%s","read from viewport manager\n");
56
m = check(read( 0, info, size));
57
58
return(m);
59
60
}
61
void
62
scalePoint (viewTriple *p)
63
{
64
65
p->x *= viewData.scaleToView;
66
p->y *= viewData.scaleToView;
67
p->z *= viewData.scaleToView;
68
69
if (viewData.cmin != viewData.cmax)
70
p->c = (p->c - viewData.cmin)/(viewData.cmax-viewData.cmin);
71
if (p->c > 1.0) p->c = 1.0;
72
else if (p->c < 0) p->c = 0.0;
73
74
} /* scalePoint */
75
76
77
/********************
78
* int spadAction() *
79
********************/
80
81
int
82
spadAction (void)
83
{
84
int viewCommand;
85
float f1, f2, f3;
86
int i1, i2, i3;
87
88
89
if (viewAloned==yes) {
90
close(0);
91
return(-1);
92
}
93
readViewman(&viewCommand, intSize);
94
95
switch (viewCommand) {
96
97
case rotate:
98
readViewman(&f1, floatSize);
99
readViewman(&f2, floatSize);
100
viewport->theta = f1;
101
viewport->phi = f2;
102
while (viewport->theta >= two_pi) viewport->theta -= two_pi;
103
while (viewport->theta < 0.0) viewport->theta += two_pi;
104
while (viewport->phi > pi) viewport->phi -= two_pi;
105
while (viewport->phi <= -pi) viewport->phi += two_pi;
106
viewport->axestheta = viewport->theta;
107
viewport->axesphi = viewport->phi;
108
spadDraw=yes;
109
rotated=yes;
110
viewport->yzOn = viewport->xzOn = viewport->xyOn = no;
111
112
break;
113
114
case zoom:
115
readViewman(&f1, floatSize);
116
viewport->scale = f1;
117
if (viewport->scale > maxScale) viewport->scale = maxScale;
118
else if (viewport->scale < minScale) viewport->scale = minScale;
119
120
spadDraw=yes;
121
zoomed = yes;
122
break;
123
124
case zoomx:
125
readViewman(&f1, floatSize);
126
readViewman(&f2, floatSize);
127
readViewman(&f3, floatSize);
128
viewport->scaleX = f1; viewport->scaleY = f2; viewport->scaleZ = f3;
129
if ((viewport->scaleX == 1.0) &&
130
(viewport->scaleY == 1.0) &&
131
(viewport->scaleZ == 1.0)) {
132
viewport->zoomXOn = viewport->zoomYOn = viewport->zoomZOn = yes;
133
} else {
134
if (viewport->scaleX == 1.0) viewport->zoomXOn = no;
135
else {
136
if (viewport->scaleX > maxScale) viewport->scaleX = maxScale;
137
else if (viewport->scaleX < minScale) viewport->scaleX = minScale;
138
}
139
if (viewport->scaleY == 1.0) viewport->zoomYOn = no;
140
else {
141
if (viewport->scaleY > maxScale) viewport->scaleY = maxScale;
142
else if (viewport->scaleY < minScale) viewport->scaleY = minScale;
143
}
144
if (viewport->scaleZ == 1.0) viewport->zoomZOn = no;
145
else {
146
if (viewport->scaleZ > maxScale) viewport->scaleZ = maxScale;
147
else if (viewport->scaleZ < minScale) viewport->scaleZ = minScale;
148
}
149
}
150
151
spadDraw=yes;
152
zoomed = yes;
153
break;
154
155
case translate:
156
readViewman(&(viewport->deltaX),floatSize);
157
readViewman(&(viewport->deltaY),floatSize);
158
if (viewport->deltaX > maxDeltaX) viewport->deltaX = maxDeltaX;
159
else if (viewport->deltaX < -maxDeltaX) viewport->deltaX = -maxDeltaX;
160
if (viewport->deltaY > maxDeltaY) viewport->deltaY = maxDeltaY;
161
else if (viewport->deltaY < -maxDeltaY) viewport->deltaY = -maxDeltaY;
162
spadDraw=yes;
163
translated = yes;
164
break;
165
166
case modifyPOINT:
167
readViewman(&i1,intSize);
168
i1--;
169
readViewman(&(refPt3D(viewData,i1)->x),floatSize);
170
readViewman(&(refPt3D(viewData,i1)->y),floatSize);
171
readViewman(&(refPt3D(viewData,i1)->z),floatSize);
172
readViewman(&(refPt3D(viewData,i1)->c),floatSize);
173
scalePoint(refPt3D(viewData,i1));
174
spadDraw=yes;
175
break;
176
177
case hideControl:
178
readViewman(&i1,intSize);
179
if (i1) { /* show control panel */
180
if (viewport->haveControl)
181
XUnmapWindow(dsply,control->controlWindow);
182
putControlPanelSomewhere(someInt);
183
} else { /* turn off control panel */
184
if (viewport->haveControl) {
185
viewport->haveControl = no;
186
XUnmapWindow(dsply,control->controlWindow);
187
}
188
}
189
break;
190
191
case axesOnOff:
192
readViewman(&i1,intSize);
193
viewport->axesOn = i1;
194
spadDraw=yes;
195
if (viewData.style == smooth) {
196
if (multiColorFlag) redoDither = yes;
197
else redoColor = yes;
198
}
199
if (viewport->haveControl) drawControlPanel();
200
break;
201
202
/* Non-uniform scaling is not in OpenAxiom yet. */
203
/* Neither is object or origin rotation. */
204
205
case perspectiveOnOff:
206
readViewman(&i1,intSize);
207
viewData.perspective = i1;
208
switchedPerspective = yes;
209
spadDraw=yes;
210
break;
211
212
case region3D:
213
readViewman(&i1,intSize);
214
viewport->regionOn = i1;
215
viewData.box = i1;
216
spadDraw=yes;
217
if (viewport->haveControl) drawControlPanel();
218
redoSmooth = yes;
219
break;
220
221
case clipRegionOnOff:
222
readViewman(&i1,intSize);
223
viewData.clipbox = i1;
224
spadDraw=yes;
225
break;
226
227
case clipSurfaceOnOff:
228
readViewman(&i1,intSize);
229
viewData.clipStuff = i1;
230
spadDraw=yes;
231
break;
232
233
case eyeDistanceData:
234
readViewman(&f1,floatSize);
235
viewData.eyeDistance = f1;
236
if (viewData.eyeDistance > maxEyeDistance)
237
viewData.eyeDistance = maxEyeDistance;
238
else if (viewData.eyeDistance < minEyeDistance)
239
viewData.eyeDistance = minEyeDistance;
240
spadDraw=yes;
241
changedEyeDistance = yes;
242
break;
243
244
case hitherPlaneData:
245
readViewman(&f1,floatSize);
246
viewData.clipPlane = f1;
247
spadDraw=yes;
248
changedEyeDistance = yes;
249
break;
250
251
case colorDef:
252
readViewman(&(viewport->hueOffset),intSize);
253
readViewman(&(viewport->numberOfHues),intSize);
254
/* spadcolors is indexed by 0 */
255
viewport->hueOffset --;
256
viewport->numberOfHues --;
257
viewport->hueTop = viewport->numberOfHues;
258
if (viewport->hueOffset < 0) viewport->hueOffset = 0;
259
if (viewport->hueTop < 0) viewport->hueTop = 0;
260
if (viewport->hueOffset >= totalHues)
261
viewport->hueOffset = totalHues-1;
262
if (viewport->hueTop >= totalHues) viewport->hueTop = totalHues-1;
263
viewport->numberOfHues = viewport->hueTop - viewport->hueOffset;
264
if ((viewport->hueTop == viewport->hueOffset) && (!viewport->monoOn))
265
redoColor = yes;
266
else {
267
redoColor = no;
268
redoDither = yes;
269
}
270
if (viewport->haveControl) drawColorMap();
271
break;
272
273
case closeAll:
274
check(write(Socket,&ack,intSize));
275
goodbye(-1);
276
277
278
case moveViewport:
279
readViewman(&i1,intSize);
280
readViewman(&i2,intSize);
281
XMoveWindow(dsply,viewport->titleWindow,i1,i2);
282
XSync(dsply,0);
283
break;
284
285
case resizeViewport:
286
readViewman(&i1,intSize);
287
readViewman(&i2,intSize);
288
XResizeWindow(dsply,viewport->titleWindow,i1,i2+titleHeight);
289
XResizeWindow(dsply,viewport->viewWindow,i1,i2);
290
spadDraw=yes;
291
redoSmooth =yes;
292
break;
293
294
case transparent:
295
case opaqueMesh:
296
case render:
297
case smooth:
298
viewData.style = viewCommand;
299
spadDraw=yes;
300
redoSmooth =yes;
301
break;
302
303
case lightDef:
304
readViewman(&(viewport->lightVector[0]),floatSize);
305
readViewman(&(viewport->lightVector[1]),floatSize);
306
readViewman(&(viewport->lightVector[2]),floatSize);
307
normalizeVector(viewport->lightVector);
308
movingLight = yes;
309
drawLightingAxes();
310
XSync(dsply,0);
311
break;
312
313
case translucenceDef:
314
readViewman(&backLightIntensity,floatSize);
315
tempLightIntensity = backLightIntensity;
316
lightIntensity = tempLightIntensity;
317
changedIntensity = yes;
318
drawLightTransArrow();
319
XSync(dsply,0);
320
break;
321
322
case changeTitle:
323
readViewman(&i1,intSize);
324
readViewman(viewport->title,i1);
325
viewport->title[i1] = '\0';
326
writeTitle();
327
switch (doingPanel) {
328
case CONTROLpanel:
329
case CONTOURpanel:
330
writeControlTitle(control->controlWindow);
331
break;
332
case VOLUMEpanel:
333
writeControlTitle(volumeWindow);
334
break;
335
case LIGHTpanel:
336
writeControlTitle(lightingWindow);
337
break;
338
} /* switch */
339
XFlush(dsply);
340
break;
341
342
case writeView:
343
readViewman(&i1,intSize);
344
readViewman(filename,i1);
345
filename[i1] = '\0';
346
sprintf(errorStr,"writing of viewport data");
347
i3 = 0;
348
readViewman(&i2,intSize);
349
while (i2) {
350
i3 = i3 | (1<<i2);
351
readViewman(&i2,intSize);
352
}
353
if (writeViewport(i3) < 0)
354
fprintf(stderr," Nothing was written\n");
355
break;
356
357
case diagOnOff:
358
readViewman(&i1,intSize);
359
if (viewData.outlineRenderOn) {
360
viewport->diagonals = i1;
361
spadDraw=yes;
362
} else {
363
strcpy(control->message," Use this option with Outline ");
364
writeControlMessage();
365
}
366
break;
367
368
case outlineOnOff:
369
readViewman(&i1,intSize);
370
if (viewData.style == render) {
371
viewData.outlineRenderOn = i1;
372
spadDraw=yes;
373
if (viewport->haveControl) drawControlPanel();
374
} else {
375
strcpy(control->message," Use this option in Shaded mode ");
376
writeControlMessage();
377
}
378
break;
379
380
case spadPressedAButton:
381
readViewman(&i1,intSize);
382
buttonAction(i1);
383
break;
384
default:
385
return(-1);
386
} /* switch */
387
388
389
ack++;
390
check(write(Socket,&ack,intSize));
391
return(0);
392
393
}
394
395
396
397