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