1 /***********************************************************************/
2 /* Open Visualization Data Explorer */
3 /* (C) Copyright IBM Corp. 1989,1999 */
4 /* ALL RIGHTS RESERVED */
5 /* This code licensed under the */
6 /* "IBM PUBLIC LICENSE - Open Visualization Data Explorer" */
7 /***********************************************************************/
8 #define String dxString
9 #define Object dxObject
10 #define Angle dxAngle
11 #define Matrix dxMatrix
12 #define Screen dxScreen
13 #define Boolean dxBoolean
14
15 #include <dxconfig.h>
16
17
18 #include <dx/dx.h>
19
20 #undef String
21 #undef Object
22 #undef Angle
23 #undef Matrix
24 #undef Screen
25 #undef Boolean
26
27 #if !defined(DX_NATIVE_WINDOWS)
28 #include <X11/Xlib.h>
29 #endif
30
31 #include <math.h>
32
33 #include "hwDeclarations.h"
34 #include "hwWindow.h"
35 #include "hwStereo.h"
36
37 typedef int (*PFI)();
38 extern PFI DXLoadObjFile(char *, char *);
39
40 /***********************************************************
41 * FIRST THE STEREO SYSTEM MODES
42 ***********************************************************/
43
44 static StereoSystemMode *_dxd_StereoSystemModes = NULL;
45 static int _dxd_nStereoSystemModes = 0;
46 static int stereoSystemLoaded = 0;
47
48 Error
_dxfLoadStereoSystemModeFile(char * fname)49 _dxfLoadStereoSystemModeFile(char *fname)
50 {
51 int (*func)() = DXLoadObjFile(fname, "DXMODULES");
52 if (! func)
53 {
54 DXWarning("unable to open stereo system mode file %s", fname);
55 return ERROR;
56 }
57 else
58 (*func)(&_dxd_nStereoSystemModes, &_dxd_StereoSystemModes);
59
60 return OK;
61 }
62
63 extern int DXDefaultStereoSystemModes(int *, StereoSystemMode **);
64
65 Error
_dxfLoadStereoSystemModes()66 _dxfLoadStereoSystemModes()
67 {
68 char *fname;
69
70 if ((fname = (char *)getenv("DX_STEREO_SYSTEM_FILE")) != NULL)
71 if (_dxfLoadStereoSystemModeFile(fname))
72 return OK;
73
74 return DXDefaultStereoSystemModes(&_dxd_nStereoSystemModes, &_dxd_StereoSystemModes);
75 }
76
77 Error
_dxfLoadStereoModes()78 _dxfLoadStereoModes()
79 {
80 if (! stereoSystemLoaded)
81 {
82 if (! _dxfLoadStereoSystemModes())
83 return ERROR;
84 stereoSystemLoaded = 1;
85 }
86 return OK;
87 }
88
89
90 Error
_dxfInitializeStereoSystemMode(void * globals,dxObject args)91 _dxfInitializeStereoSystemMode(void *globals, dxObject args)
92 {
93 DEFGLOBALDATA(globals);
94 int mode = -1;
95
96 #if defined(DX_NATIVE_WINDOWS)
97 DEFPORT(PORT_HANDLE);
98 HDC tempHdc = GetDC(XWINID);
99 #endif
100
101 if (! stereoSystemLoaded)
102 {
103 _dxfLoadStereoSystemModes();
104 stereoSystemLoaded = 1;
105 }
106
107 if (args)
108 {
109 if (DXGetObjectClass(args) == CLASS_ARRAY)
110 if (! DXExtractInteger(args, &mode))
111 mode = -1;
112 }
113
114 if (mode >= _dxd_nStereoSystemModes)
115 mode = -1;
116
117 if (mode != STEREOSYSTEMMODE)
118 {
119 if (STEREOSYSTEMMODE >= 0)
120 _dxfExitStereoSystemMode(globals);
121
122 if (mode >= 0)
123 {
124 StereoSystemMode *ssm = _dxd_StereoSystemModes + mode;
125
126 #if defined(DX_NATIVE_WINDOWS)
127 if (! (*ssm->initializeStereoSystemMode)(tempHdc, XWINID))
128 #else
129 if (! (*ssm->initializeStereoSystemMode)(DPY, XWINID))
130 #endif
131 {
132 #if defined(DX_NATIVE_WINDOWS)
133 ReleaseDC(XWINID, tempHdc);
134 #endif
135 STEREOSYSTEMMODE = -1;
136 return ERROR;
137 }
138
139 #if defined(DX_NATIVE_WINDOWS)
140 (*ssm->createStereoWindows)(tempHdc, XWINID,
141 &LEFTWINDOW, &LEFTWINDOWINFO,
142 &RIGHTWINDOW, &RIGHTWINDOWINFO);
143 #else
144 (*ssm->createStereoWindows)(DPY, XWINID,
145 &LEFTWINDOW, &LEFTWINDOWINFO,
146 &RIGHTWINDOW, &RIGHTWINDOWINFO);
147 #endif
148 }
149
150 STEREOSYSTEMMODE = mode;
151 }
152
153 #if defined(DX_NATIVE_WINDOWS)
154 ReleaseDC(XWINID, tempHdc);
155 #endif
156
157 return OK;
158 }
159
160 int
_dxfExitStereoSystemMode(void * globals)161 _dxfExitStereoSystemMode(void *globals)
162 {
163 DEFGLOBALDATA(globals);
164
165 #if defined(DX_NATIVE_WINDOWS)
166 DEFPORT(PORT_HANDLE);
167 HDC tempHdc = GetDC(XWINID);
168 #endif
169
170 if (STEREOSYSTEMMODE)
171 {
172 StereoSystemMode *ssm = _dxd_StereoSystemModes + STEREOSYSTEMMODE;
173 #if defined(DX_NATIVE_WINDOWS)
174 (*ssm->exitStereo)(tempHdc, XWINID, &LEFTWINDOW, &RIGHTWINDOW);
175 #else
176 (*ssm->exitStereo)(DPY, XWINID, LEFTWINDOW, RIGHTWINDOW);
177 #endif
178 STEREOCAMERADATA = NULL;
179 LEFTWINDOW = 0;
180 RIGHTWINDOW = 0;
181 }
182
183 #if defined(DX_NATIVE_WINDOWS)
184 ReleaseDC(XWINID, tempHdc);
185 #endif
186
187 return OK;
188 }
189
190 /***********************************************************
191 * NOW THE STEREO CAMERA MODES
192 ***********************************************************/
193
194 // static void *defInitializeStereoCameraMode(void *, dxObject);
195 // static int defExitStereoCameraMode(void *);
196
197 static StereoCameraMode *_dxd_StereoCameraModes = NULL;
198 static int _dxd_nStereoCameraModes = 0;
199 static int stereoCameraLoaded = 0;
200
201 Error
_dxfLoadStereoCameraModeFile(char * fname)202 _dxfLoadStereoCameraModeFile(char *fname)
203 {
204 int (*func)() = DXLoadObjFile(fname, "DXMODULES");
205 if (! func)
206 {
207 DXWarning("unable to open stereo system mode file %s", fname);
208 return ERROR;
209 }
210 else
211 (*func)(&_dxd_nStereoCameraModes, &_dxd_StereoCameraModes);
212
213 return OK;
214
215 error:
216 return ERROR;
217 }
218
219 extern int DXDefaultStereoCameraModes(int *, StereoCameraMode **);
220
221 Error
_dxfLoadStereoCameraModes()222 _dxfLoadStereoCameraModes()
223 {
224 char *fname;
225
226 if ((fname = (char *)getenv("DX_STEREO_CAMERA_FILE")) != NULL)
227 if (_dxfLoadStereoCameraModeFile(fname))
228 return OK;
229
230 return DXDefaultStereoCameraModes(&_dxd_nStereoCameraModes, &_dxd_StereoCameraModes);
231 }
232
233
234 Error
_dxfInitializeStereoCameraMode(void * globals,dxObject stereoArgs)235 _dxfInitializeStereoCameraMode(void *globals, dxObject stereoArgs)
236 {
237 DEFGLOBALDATA(globals);
238 int mode = -1;
239 dxObject modeArg = NULL;
240 dxObject argArg = NULL;
241
242 if (! stereoCameraLoaded)
243 {
244 _dxfLoadStereoCameraModes();
245 stereoCameraLoaded = 1;
246 }
247
248 if (stereoArgs)
249 {
250 if (DXGetObjectClass(stereoArgs) == CLASS_GROUP)
251 {
252 modeArg = DXGetMember((Group)stereoArgs, "mode");
253 argArg = DXGetMember((Group)stereoArgs, "args");
254 }
255 else if (DXGetObjectClass(stereoArgs) == CLASS_ARRAY)
256 {
257 modeArg = stereoArgs;
258 }
259
260 if (modeArg)
261 if (! DXExtractInteger(modeArg, &mode))
262 mode = -1;
263 }
264
265 if (mode >= _dxd_nStereoCameraModes)
266 mode = -1;
267
268 if (mode != STEREOCAMERAMODE)
269 {
270 if (STEREOCAMERAMODE >= 0)
271 _dxfExitStereoCameraMode(globals);
272
273 if (mode >= 0)
274 {
275 StereoCameraMode *scm = _dxd_StereoCameraModes + mode;
276
277 STEREOCAMERADATA = (*scm->initializeStereoCameraMode)
278 (STEREOCAMERADATA, argArg);
279 if (! STEREOCAMERADATA)
280 return ERROR;
281 }
282
283 STEREOCAMERAMODE = mode;
284 }
285 else if (mode >= 0)
286 {
287 StereoCameraMode *scm = _dxd_StereoCameraModes + mode;
288 STEREOCAMERADATA = (*scm->initializeStereoCameraMode)
289 (STEREOCAMERADATA, argArg);
290 if (! STEREOCAMERADATA)
291 return ERROR;
292 }
293
294 return OK;
295 }
296
297 int
_dxfCreateStereoCameras(void * globals,int p,float fov,float width,float * to,float * from,float * up,float Near,float Far,float * lto,float * lfrom,float * lup,float ** lProjection,float * rto,float * rfrom,float * rup,float ** rProjection)298 _dxfCreateStereoCameras(void *globals,
299 int p, float fov, float width,
300 float *to, float *from, float *up, float Near, float Far,
301 float *lto, float *lfrom, float *lup, float **lProjection,
302 float *rto, float *rfrom, float *rup, float **rProjection)
303 {
304 DEFGLOBALDATA(globals);
305
306 if (STEREOCAMERAMODE >= 0)
307 {
308 return (*_dxd_StereoCameraModes[STEREOCAMERAMODE].createStereoCameras)(
309 STEREOCAMERADATA,
310 p, fov, width,
311 to, from, up, Near, Far,
312 lto, lfrom, lup, lProjection,
313 rto, rfrom, rup, rProjection);
314 }
315 else
316 {
317 rto[0] = lto[0] = to[0];
318 rto[1] = lto[1] = to[1];
319 rto[2] = lto[2] = to[2];
320 rup[0] = lup[0] = up[0];
321 rup[1] = lup[1] = up[1];
322 rup[2] = lup[2] = up[2];
323 rfrom[0] = lfrom[0] = from[0];
324 rfrom[1] = lfrom[1] = from[1];
325 rfrom[2] = lfrom[2] = from[2];
326 *lProjection = NULL;
327 *rProjection = NULL;
328 return OK;
329 }
330 }
331
332
333 int
_dxfExitStereoCameraMode(void * globals)334 _dxfExitStereoCameraMode(void *globals)
335 {
336 DEFGLOBALDATA(globals);
337 if (STEREOCAMERAMODE >= 0)
338 {
339 StereoCameraMode *scm = _dxd_StereoCameraModes + STEREOCAMERAMODE;
340 (*scm->exitStereoCameraMode)(STEREOCAMERADATA);
341 STEREOCAMERADATA = NULL;
342 STEREOCAMERAMODE = -1;
343 }
344 return OK;
345 }
346
347