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 
38 /************** Default Stereo Camera Mode ********************
39  * The arguments of the default camera define a asymmetric frustum
40  * and ocular separation
41  ****************************************************************/
42 
43 typedef struct
44 {
45     float overlap;
46     float separation;
47     float aspect;
48     float lp[16];
49     float rp[16];
50 } StereoArgs;
51 
52 
53 static void *defInitializeStereoCameraMode0(void *data, dxObject arg);
54 static int  defExitStereoCameraMode0(void *data);
55 static int  defCreateStereoCameras0(void *,
56 					int, float, float,
57 					float *, float *, float *, float, float,
58 					float *, float *, float *, float **,
59 					float *, float *, float *, float **);
60 #if defined(DX_NATIVE_WINDOWS)
61 /* Place holder for windows version -- correct prototype? */
62 static int  defMapStereoXY0(void *, HWND, HWND, WindowInfo,
63 							int, int, int*, int*);
64 #else
65 static int  defMapStereoXY0(void *, Window, Window, WindowInfo,
66 					int, int, int*, int*);
67 #endif
68 
69 static StereoCameraMode _defaultStereoCameraModes[1];
70 
71 int
DXDefaultStereoCameraModes(int * nModes,StereoCameraMode ** scms)72 DXDefaultStereoCameraModes(int *nModes, StereoCameraMode **scms)
73 {
74     *scms = _defaultStereoCameraModes;
75 
76     (*scms)[0].initializeStereoCameraMode = defInitializeStereoCameraMode0;
77     (*scms)[0].exitStereoCameraMode       = defExitStereoCameraMode0;
78     (*scms)[0].createStereoCameras        = defCreateStereoCameras0;
79     (*scms)[0].mapStereoXY 		  = defMapStereoXY0;
80 
81     *nModes = 1;
82 
83     return OK;
84 }
85 
86 static void *
defInitializeStereoCameraMode0(void * data,dxObject arg)87 defInitializeStereoCameraMode0(void *data, dxObject arg)
88 {
89     if (!data)
90 	data = (void *)DXAllocate(sizeof(StereoArgs));
91 
92     if (!arg || !DXExtractParameter(arg, TYPE_FLOAT, 3, 1, (Pointer)data))
93     {
94 	DXSetError(ERROR_BAD_PARAMETER, "bad args to default stereo camera model");
95 	goto error;
96     }
97 
98     return data;
99 
100 error:
101     DXFree((Pointer)data);
102     return NULL;
103 }
104 
105 static int
defExitStereoCameraMode0(void * data)106 defExitStereoCameraMode0(void *data)
107 {
108     DXFree((Pointer)data);
109     return OK;
110 }
111 
112 static int
defCreateStereoCameras0(void * data,int p,float fov,float width,float * to,float * from,float * up,float n,float f,float * lto,float * lfrom,float * lup,float ** lProj,float * rto,float * rfrom,float * rup,float ** rProj)113 defCreateStereoCameras0(void *data,
114 		    int p, float fov, float width,
115 		    float *to, float *from, float *up, float n, float f,
116 		    float *lto, float *lfrom, float *lup, float **lProj,
117 		    float *rto, float *rfrom, float *rup, float **rProj)
118 {
119     StereoArgs *args = (StereoArgs *)data;
120     float vx, vy, vz;
121     float ux, uy, uz;
122     float ax, ay, az;
123     float d;
124     float l, r, b, t;
125     float *lp = args->lp;
126     float *rp = args->rp;
127 
128     vx = from[0] - to[0];
129     vy = from[1] - to[1];
130     vz = from[2] - to[2];
131     d = sqrt(vx*vx + vy*vy + vz*vz);
132     vx = vx / d;
133     vy = vy / d;
134     vz = vz / d;
135 
136     ux = up[0];
137     uy = up[1];
138     uz = up[2];
139     d = sqrt(ux*ux + uy*uy + uz*uz);
140     ux = ux / d;
141     uy = uy / d;
142     vz = vz / d;
143 
144     ax = uy*vz - uz*vy;
145     ay = uz*vx - ux*vz;
146     az = ux*vy - uy*vx;
147 
148     lfrom[0] = from[0] - args->separation*ax;
149     lfrom[1] = from[1] - args->separation*ay;
150     lfrom[2] = from[2] - args->separation*az;
151     lto[0]   = to[0]   - args->separation*ax;
152     lto[1]   = to[1]   - args->separation*ay;
153     lto[2]   = to[2]   - args->separation*az;
154     lup[0]   = up[0];
155     lup[1]   = up[1];
156     lup[2]   = up[2];
157 
158     rfrom[0] = from[0] + args->separation*ax;
159     rfrom[1] = from[1] + args->separation*ay;
160     rfrom[2] = from[2] + args->separation*az;
161     rto[0]   = to[0]   + args->separation*ax;
162     rto[1]   = to[1]   + args->separation*ay;
163     rto[2]   = to[2]   + args->separation*az;
164     rup[0]   = up[0];
165     rup[1]   = up[1];
166     rup[2]   = up[2];
167 
168     {
169 	float t = n;
170 	n = f;
171 	f = t;
172     }
173 
174     r = args->overlap;
175     l = r - 1;
176     t = (0.5 * args->aspect);
177     b = -t;
178 
179     if (p)
180     {
181 	r *= fov;
182 	l *= fov;
183 	t *= fov;
184 	b *= fov;
185     }
186     else
187     {
188 	r *= width;
189 	l *= width;
190 	t *= width;
191 	b *= width;
192     }
193 
194     lp[ 0] = 2/(r-l); lp[ 4] =     0.0; lp[ 8] = (r+l)/(r-l); lp[12] =         0.0;
195     lp[ 1] = 0.0;     lp[ 5] = 2/(t-b); lp[ 9] = (t+b)/(t-b); lp[13] =         0.0;
196     lp[ 2] = 0.0;     lp[ 6] =     0.0; lp[10] = (f+n)/(f-n); lp[14] = 2*f*n/(f-n);
197     lp[ 3] = 0.0;     lp[ 7] =     0.0; lp[11] =        -1.0; lp[15] =         0.0;
198 
199     *lProj = lp;
200 
201     l = -args->overlap;
202     r = l + 1;
203     t = (0.5 * args->aspect);
204     b = -t;
205 
206     if (p)
207     {
208 	r *= fov;
209 	l *= fov;
210 	t *= fov;
211 	b *= fov;
212     }
213     else
214     {
215 	r *= width;
216 	l *= width;
217 	t *= width;
218 	b *= width;
219     }
220 
221     rp[ 0] = 2/(r-l); rp[ 4] =     0.0; rp[ 8] = (r+l)/(r-l); rp[12] =         0.0;
222     rp[ 1] = 0.0;     rp[ 5] = 2/(t-b); rp[ 9] = (t+b)/(t-b); rp[13] =         0.0;
223     rp[ 2] = 0.0;     rp[ 6] =     0.0; rp[10] = (f+n)/(f-n); rp[14] = 2*f*n/(f-n);
224     rp[ 3] = 0.0;     rp[ 7] =     0.0; rp[11] =        -1.0; rp[15] =         0.0;
225 
226     *rProj = rp;
227 
228     return OK;
229 }
230 
231 #if defined(DX_NATIVE_WINDOWS)
232 static int
defMapStereoXY0(void * data,HWND frame,HWND w,WindowInfo wi,int xi,int yi,int * xo,int * yo)233 defMapStereoXY0(void *data, HWND frame, HWND w, WindowInfo wi,
234 				int xi, int yi, int *xo, int *yo)
235 #else
236 static int
237 defMapStereoXY0(void *data, Window frame, Window w, WindowInfo wi,
238 			int xi, int yi, int *xo, int *yo)
239 #endif
240 {
241     *xo = xi;
242     *yo = yi;
243     return 0;
244 }
245 
246 
247 
248 static void *
defInitializeStereoCameraMode1(void * data,dxObject arg)249 defInitializeStereoCameraMode1(void *data, dxObject arg)
250 {
251     if (!data)
252 	data = (void *)DXAllocate(sizeof(StereoArgs));
253 
254     if (!arg || !DXExtractParameter(arg, TYPE_FLOAT, 3, 1, (Pointer)data))
255     {
256 	DXSetError(ERROR_BAD_PARAMETER, "bad args to default stereo camera model");
257 	goto error;
258     }
259 
260     return data;
261 
262 error:
263     DXFree((Pointer)data);
264     return NULL;
265 }
266 
267