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-2013, 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 _FUN3D_C
37
38
#include <stdlib.h>
39
#include <unistd.h>
40
#include <stdio.h>
41
#include <string.h>
42
43
#include "open-axiom.h"
44
#include "viewman.h"
45
#include "mode.h"
46
#include "actions.h"
47
48
#include "util.H1"
49
#include "sockio.h"
50
#include "fun3D.H1"
51
#include "make3D.H1"
52
#include "readView.H1"
53
#include "cfuns.h"
54
55
using namespace OpenAxiom;
56
57
void
58
funView3D(int viewCommand)
59
{
60
61
int viewPID;
62
float f1,f2,f3,f4;
63
int i1,i2;
64
viewManager *viewport;
65
66
viewPID = get_int(spadSock);
67
68
viewport = viewports;
69
while ((viewport) && (viewport->PID != viewPID))
70
viewport = viewport->nextViewport;
71
72
if (viewport) {
73
send_int(spadSock,1); /* acknowledge to spad */
74
75
viewmanEvent.xclient.window = viewport->viewWindow;
76
77
write(viewport->viewOut,&viewCommand,intSize);
78
switch (viewCommand) {
79
case rotate:
80
f1 = get_float(spadSock);
81
f2 = get_float(spadSock);
82
write(viewport->viewOut,&f1,floatSize);
83
write(viewport->viewOut,&f2,floatSize);
84
break;
85
86
case zoom:
87
f1 = get_float(spadSock);
88
write(viewport->viewOut,&f1,floatSize);
89
break;
90
91
case zoomx:
92
f1 = get_float(spadSock);
93
f2 = get_float(spadSock);
94
f3 = get_float(spadSock);
95
write(viewport->viewOut,&f1,floatSize);
96
write(viewport->viewOut,&f2,floatSize);
97
write(viewport->viewOut,&f3,floatSize);
98
break;
99
100
case translate:
101
f1 = get_float(spadSock);
102
f2 = get_float(spadSock);
103
write(viewport->viewOut,&f1,floatSize);
104
write(viewport->viewOut,&f2,floatSize);
105
break;
106
107
case modifyPOINT:
108
i1 = get_int(spadSock);
109
f1 = get_float(spadSock);
110
f2 = get_float(spadSock);
111
f3 = get_float(spadSock);
112
f4 = get_float(spadSock);
113
write(viewport->viewOut,&i1,intSize);
114
write(viewport->viewOut,&f1,floatSize);
115
write(viewport->viewOut,&f2,floatSize);
116
write(viewport->viewOut,&f3,floatSize);
117
write(viewport->viewOut,&f4,floatSize);
118
break;
119
120
case hideControl:
121
i1 = get_int(spadSock);
122
write(viewport->viewOut,&i1,intSize);
123
break;
124
125
case axesOnOff:
126
case perspectiveOnOff:
127
case region3D:
128
case clipRegionOnOff:
129
case clipSurfaceOnOff:
130
i1 = get_int(spadSock);
131
write(viewport->viewOut,&i1,intSize);
132
break;
133
134
case eyeDistanceData:
135
case hitherPlaneData:
136
f1 = get_float(spadSock);
137
write(viewport->viewOut,&f1,floatSize);
138
break;
139
140
case colorDef:
141
i1 = get_int(spadSock);
142
i2 = get_int(spadSock);
143
write(viewport->viewOut,&i1,intSize);
144
write(viewport->viewOut,&i2,intSize);
145
break;
146
147
case moveViewport:
148
i1 = get_int(spadSock);
149
i2 = get_int(spadSock);
150
write(viewport->viewOut,&i1,intSize);
151
write(viewport->viewOut,&i2,intSize);
152
break;
153
154
case resizeViewport:
155
i1 = get_int(spadSock);
156
i2 = get_int(spadSock);
157
write(viewport->viewOut,&i1,intSize);
158
write(viewport->viewOut,&i2,intSize);
159
break;
160
161
case transparent:
162
case opaqueMesh:
163
case render:
164
break;
165
166
case lightDef:
167
f1 = get_float(spadSock);
168
f2 = get_float(spadSock);
169
f3 = get_float(spadSock);
170
write(viewport->viewOut,&f1,floatSize);
171
write(viewport->viewOut,&f2,floatSize);
172
write(viewport->viewOut,&f3,floatSize);
173
break;
174
175
case translucenceDef:
176
f1 = get_float(spadSock);
177
write(viewport->viewOut,&f1,floatSize);
178
break;
179
180
181
case changeTitle:
182
s1 = get_string(spadSock);
183
i1 = strlen(s1);
184
write(viewport->viewOut,&i1,intSize);
185
write(viewport->viewOut,s1,i1);
186
break;
187
188
case writeView:
189
s1 = get_string(spadSock);
190
i1 = strlen(s1);
191
write(viewport->viewOut,&i1,intSize);
192
write(viewport->viewOut,s1,i1);
193
/* write out the types of things to be written */
194
i2 = get_int(spadSock);
195
write(viewport->viewOut,&i2,intSize);
196
while (i2) {
197
i2 = get_int(spadSock);
198
write(viewport->viewOut,&i2,intSize);
199
}
200
break;
201
202
case diagOnOff:
203
i1 = get_int(spadSock);
204
write(viewport->viewOut,&i1,intSize);
205
break;
206
207
case outlineOnOff:
208
i1 = get_int(spadSock);
209
write(viewport->viewOut,&i1,intSize);
210
break;
211
212
case spadPressedAButton:
213
i1 = get_int(spadSock);
214
write(viewport->viewOut,&i1,intSize);
215
break;
216
} /* switch */
217
/*** get acknowledge from viewport */
218
219
readViewport(viewport,&acknow,intSize);
220
send_int(spadSock,1); /* acknowledge to spad */
221
} else { /* if (viewport) */
222
send_int(spadSock,-1); /* send error value in acknowledge to spad */
223
}
224
225
}
226
void
227
forkView3D(int typeOfViewport)
228
{
229
230
viewManager *viewport;
231
int childPID, code;
232
int i;
233
234
view3DStruct doView3D;
235
int pipe0[2],pipe1[2];
236
int *anIndex;
237
238
char envAXIOM[100],runView[100];
239
int j,k;
240
LLPoint *anLLPoint;
241
LPoint *anLPoint;
242
243
#ifdef DEBUG
244
fprintf(stderr,"Pipe calls for 3D\n");
245
#endif
246
check(pipe(pipe0));
247
check(pipe(pipe1));
248
249
#ifdef DEBUG
250
fprintf(stderr,"Fork routine for 3D\n");
251
#endif
252
switch(childPID = check(fork())) {
253
254
case -1:
255
printf("Cannot create a new process - you probably have too many things running already.\n");
256
return;
257
258
case 0:
259
/*****************************
260
* child process *
261
*****************************/
262
/* map pipes from viewport manager to standard input and output */
263
#ifdef DEBUG
264
fprintf(stderr,"Mapping pipes to standard I/O in 3D\n");
265
#endif
266
check(dup2(pipe0[0],0));
267
check(dup2(pipe1[1],1));
268
close(pipe0[0]);
269
close(pipe0[1]);
270
close(pipe1[0]);
271
close(pipe1[1]);
272
273
#ifdef DEBUG
274
fprintf(stderr,"Executing ThreeDimensionalViewport process\n");
275
#endif
276
sprintf(envAXIOM,"%s",oa_getenv("AXIOM"));
277
sprintf(runView,"%s%s",envAXIOM,"/lib/view3D");
278
check(execl(runView,runView, (char*) NULL));
279
fprintf(stderr,"The viewport manager could not execute view3D.\nCheck that view3D is on your PATH.\n");
280
exit(-1);
281
282
default:
283
/******************************
284
* parent process *
285
******************************/
286
if (!(viewport = (viewManager *)malloc(sizeof(viewManager)))) {
287
printf("Ran out of memory trying to create a new viewport process.\n");
288
return;
289
}
290
viewport->viewType = typeOfViewport;
291
viewport->PID = childPID;
292
293
/* set up pipes to child process */
294
close(pipe0[0]);
295
close(pipe1[1]);
296
viewport->viewIn = pipe1[0];
297
viewport->viewOut = pipe0[1];
298
299
/* add new viewport to global list */
300
viewport->nextViewport = viewports;
301
viewports = viewport;
302
303
if (viewport->viewIn <0) {
304
fprintf(stderr,
305
"The viewport manager could not create connection to a 3D viewport window. Try again.\n");
306
return;
307
} else {
308
309
code = readViewport(viewport,&acknow,intSize);
310
311
if (code < 0) {
312
fprintf(stderr,
313
"The viewport manager could not read from a 3D viewport window\ncode=%d\nack=%d\n",code,acknow);
314
return;
315
}
316
}
317
318
makeView3DFromSpadData(&doView3D,typeOfViewport);
319
320
/* tell the child that parent is a viewport manager */
321
i = no;
322
write(viewport->viewOut,&i,sizeof(int));
323
324
write(viewport->viewOut,&doView3D,sizeof(view3DStruct));
325
326
i = strlen(doView3D.title)+1;
327
write(viewport->viewOut,&i,intSize); /* tell the length of the title to child */
328
write(viewport->viewOut,doView3D.title,i); /* tell the title to the child */
329
write(viewport->viewOut,&(doView3D.lightVec[0]),floatSize);
330
write(viewport->viewOut,&(doView3D.lightVec[1]),floatSize);
331
write(viewport->viewOut,&(doView3D.lightVec[2]),floatSize);
332
333
/* send generalized 3D components */
334
write(viewport->viewOut,&(doView3D.numOfPoints),intSize);
335
for (i=0; i<doView3D.numOfPoints; i++) {
336
write(viewport->viewOut,&(refPt(doView3D,i)->x),floatSize);
337
write(viewport->viewOut,&(refPt(doView3D,i)->y),floatSize);
338
write(viewport->viewOut,&(refPt(doView3D,i)->z),floatSize);
339
write(viewport->viewOut,&(refPt(doView3D,i)->c),floatSize);
340
}
341
write(viewport->viewOut,&(doView3D.lllp.numOfComponents),intSize);
342
anLLPoint = doView3D.lllp.llp;
343
for (i=0; i<doView3D.lllp.numOfComponents; i++,anLLPoint++) {
344
write(viewport->viewOut,&(anLLPoint->prop.closed),intSize);
345
write(viewport->viewOut,&(anLLPoint->prop.solid),intSize);
346
write(viewport->viewOut,&(anLLPoint->numOfLists),intSize);
347
anLPoint = anLLPoint->lp;
348
for (j=0; j<anLLPoint->numOfLists; j++,anLPoint++) {
349
write(viewport->viewOut,&(anLPoint->prop.closed),intSize);
350
write(viewport->viewOut,&(anLPoint->prop.solid),intSize);
351
write(viewport->viewOut,&(anLPoint->numOfPoints),intSize);
352
anIndex = anLPoint->indices;
353
for (k=0; k<anLPoint->numOfPoints; k++,anIndex++)
354
write(viewport->viewOut,anIndex,intSize);
355
} /* for LPoints in LLPoints (j) */
356
} /* for LLPoints in LLLPoints (i) */
357
358
/*** get acknowledge from viewport */
359
code = readViewport(viewport,&(viewport->viewWindow),sizeof(Window));
360
openaxiom_sleep(1); /* wait a second...*/
361
send_int(spadSock,viewport->PID); /* acknowledge to spad */
362
363
} /* switch */
364
365
} /* forkView3D() */
366
367
368
369