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