FreeWRL / FreeX3D 4.3.0
Viewer.h
1/*
2
3
4Viewer ???
5
6*/
7
8/****************************************************************************
9 This file is part of the FreeWRL/FreeX3D Distribution.
10
11 Copyright 2009 CRC Canada. (http://www.crc.gc.ca)
12
13 FreeWRL/FreeX3D is free software: you can redistribute it and/or modify
14 it under the terms of the GNU Lesser Public License as published by
15 the Free Software Foundation, either version 3 of the License, or
16 (at your option) any later version.
17
18 FreeWRL/FreeX3D is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with FreeWRL/FreeX3D. If not, see <http://www.gnu.org/licenses/>.
25****************************************************************************/
26
27
28#ifndef __FREEWRL_VIEWER_H__
29#define __FREEWRL_VIEWER_H__
30
31#include "quaternion.h"
32void fwl_set_viewer_type(const int type);
33int fwl_setNavMode(char *mode);
34
35#define PRESS "PRESS"
36#define PRESS_LEN 5
37
38#define DRAG "DRAG"
39#define DRAG_LEN 4
40
41#define RELEASE "RELEASE"
42#define RELEASE_LEN 7
43
44#define KEYS_HANDLED 12
45
46
47#define VIEWER_STEREO_OFF 0
48#define VIEWER_STEREO_SHUTTERGLASSES 1
49#define VIEWER_STEREO_SIDEBYSIDE 2
50#define VIEWER_STEREO_ANAGLYPH 3
51#define VIEWER_STEREO_UPDOWN 4
52#define VIEWER_STEREO_CARDBOARD 5
53#define VIEWER_STEREO_QUADRANT 6
54
55
56#define X_AXIS 0
57#define Y_AXIS 1
58#define Z_AXIS 2
59
60#define STRING_SIZE 256
61
62#ifdef _MSC_VER
63#define IN_FILE "C:/tmp/inpdev.txt"
64#else
65#define IN_FILE "/tmp/inpdev"
66#endif
67#define IN_FILE_BYTES 100
68#define INPUT_LEN 9
69#define INPUT_LEN_Z 8
70#define X_OFFSET 8
71#define Y_OFFSET 17
72#define Z_OFFSET 0
73#define QUAT_W_OFFSET 26
74#define QUAT_X_OFFSET 35
75#define QUAT_Y_OFFSET 44
76#define QUAT_Z_OFFSET 53
77
78
79#define VIEWER_TRANSITION_TELEPORT 0
80#define VIEWER_TRANSITION_LINEAR 1
81#define VIEWER_TRANSITION_ANIMATE 2
82
83
84#define CALCULATE_EXAMINE_DISTANCE \
85 { \
86 float xd, yd,zd; \
87 double test; \
88 /* calculate distance between the node position and defined centerOfRotation */ \
89 xd = (float) viewer->currentPosInModel.x; \
90 yd = (float) viewer->currentPosInModel.y; \
91 zd = (float) viewer->currentPosInModel.z; \
92 test = sqrt (xd*xd+yd*yd+zd*zd); \
93 /* printf ("htw; cur Dist %4.2f, calculated %4.2f at %lf\n", Viewer.Dist, test,TickTime()); */\
94 viewer->Dist = test; \
95 }
96
97
98#define INITIATE_POSITION \
99 xd = vp->position.c[0]-vp->centerOfRotation.c[0]; \
100 yd = vp->position.c[1]-vp->centerOfRotation.c[1]; \
101 zd = vp->position.c[2]-vp->centerOfRotation.c[2]; \
102 viewer->Dist = sqrt (xd*xd+yd*yd+zd*zd);
103
104#define INITIATE_ROTATION_ORIGIN \
105 viewer->examine.Origin.x = vp->centerOfRotation.c[0]; \
106 viewer->examine.Origin.y = vp->centerOfRotation.c[1]; \
107 viewer->examine.Origin.z = vp->centerOfRotation.c[2];
108
109
110typedef struct viewer_walk {
111 double SX;
112 double SY;
113 double XD;
114 double YD;
115 double ZD;
116 double RD;
117} X3D_Viewer_Walk;
118
119
120typedef struct viewer_examine {
121 struct point_XYZ Origin;
122 Quaternion OQuat;
123 Quaternion SQuat;
124 double ODist;
125 double SY;
126} X3D_Viewer_Examine;
127
128typedef struct viewer_ypz {
129 double ypz0[3];
130 double ypz[3];
131 float x,y;
132} X3D_Viewer_Spherical;
133
134typedef struct viewer_inplane {
135 double x,y;
136 double xx,yy;
137 int on;
138 int ibut;
139} X3D_Viewer_InPlane;
140
141typedef struct key {
142 char key;
143 unsigned int hit;
144} Key;
145typedef struct keyHit {
146 int direction;
147 double epoch; //original keydown time
148 double era; //keydown time not yet used by handle_tick
149 int once; //flag for handle_tick to tell if its used this keyHit already
150} KeyHit;
151
152
153/* Modeled after Descent(tm) ;) */
154typedef struct viewer_fly {
155 double Velocity[2][3];
156 KeyHit down[2][3]; //
157 int ndown[2][3]; //number of clicks queued per axis motion
158 KeyHit wasDown[2][3][10]; //up to 10 chars per axis motion are queued for fly_tick
159 double lasttime;
160} X3D_Viewer_Fly;
161
162typedef struct viewer_pan {
163 float pin_point_plane[3];
164 double pin_point_planed[3];
165 double down_pos[3];
166} X3D_Viewer_Pan;
167
168typedef struct viewer {
169 struct point_XYZ currentPosInModel;
170 struct point_XYZ Pos;
171 Quaternion Quat;
172 struct point_XYZ Pos0;
173 Quaternion Quat0;
174 struct point_XYZ Up; // 0 1 0 except geoVP
175 int headlight;
176 int collision; //added July 7, 2012
177 double speed;
178 double Dist; //examine dist
179 /*stereovision...*/
180 int isStereo; /*=1 stereovision of any type (all types require viewpoint to shift left and right in scene) */
181 int isStereoB;
182 int iside; /* rendering buffer index Left=0 Right=1 */
183 int isideB;
184 int sidebyside; /*=1 if 2 viewport method*/
185 int updown; /*=1 if 2 viewport method*/
186 int updownB; //for contenttype_stereo_updown
187 int shutterGlasses;
188 int cardboard;
189 int quadrant;
190 int haveQuadbuffer;
191 int anaglyph; /* = 1 if analglyph is turned on */
192 int anaglyphB; //for contenttype_stereo_anaglyph
193 int dominantEye; /* 2D screen cursor picks in which viewport? 0=Left 1=Right */
194 int eitherDominantEye; //1 = switch based on which viewport mouse is over (sidebyside and updown) 0= always use dominantEye;
195 double stereoParameter;
196 double eyehalf;
197 double eyehalfangle;
198 double screendist;
199 double eyedist;
200
201 int iprog[2]; /*anaglyph R=0,GBACM per side */
202 unsigned int buffer;
203 int oktypes[32]; /* boolean for types being acceptable. */
204 X3D_Viewer_Walk walk;
205 X3D_Viewer_Examine examine;
206 X3D_Viewer_Fly fly;
207 X3D_Viewer_Spherical ypz;
208 X3D_Viewer_InPlane inplane;
209 X3D_Viewer_Pan pan;
210 struct point_XYZ VPvelocity;
211
212 int SLERPing2;
213 int SLERPing2justStarted;
214
215 int SLERPing;
216 double startSLERPtime;
217
218 int SLERPing3;
219
220 int type; /* eg, VIEWER_EXAMINE, etc */
221 int lastType; /* LOOKAT saves previous type, and recovers it when done */
222 int LookatMode; //0 = not, 1= mainloop should do a node pick operation then set this back to 0 */
223 int transitionType; /* going from one viewpoint to another */
224 double transitionTime;
225 double lasttime;
226
227 struct point_XYZ startSLERPPos;
228 Quaternion startSLERPQuat;
229
230 double startSLERPDist, endSLERPDist;
231 struct point_XYZ endSLERPPos;
232 Quaternion endSLERPQuat;
233
234 double slerp_viewmatrix[16];
235 double slerp_posorimatrix[16];
236 int vp2rnSaved;
237
238 int doExamineModeDistanceCalculations;
239
240 /* are we perspective or ortho? */
241 int ortho;
242 double orthoField[4];
243
244 /* are we normal, or rotated? (makes sense only for mobile devices) */
245 int screenOrientation;
246 double nearPlane;
247 double farPlane;
248 double xcenter;
249 double backgroundPlane ;
250 GLDOUBLE fieldofview;
251 GLDOUBLE fovZoom ;
252 int wasBound; /* 0 for default viewpoint, 1 thereafter (for no-slerp startup) */
253
254} X3D_Viewer;
255X3D_Viewer *ViewerByLayerId(int layerid);
256//extern X3D_Viewer Viewer; /* in VRMLC.pm */
257X3D_Viewer *Viewer();
258struct X3D_Node *getActiveLayerBoundViewpoint();
259void fwl_set_viewer_type0(X3D_Viewer *viewer, const int type);
260void viewer_default(void);
261void viewer_update_user_offsets0(X3D_Viewer *viewer);
262void viewer_fetch_user_offsets0(X3D_Viewer *viewer);
263void viewer_update_LCS(X3D_Viewer *viewer);
264void viewer_fetch_LCS(X3D_Viewer *viewer);
265
266void Viewer_anaglyph_setSide(int iside);
267void Viewer_anaglyph_clearSides();
268void fwl_init_StereoDefaults(void);
269
270void viewer_postGLinit_init(void);
271
272void viewer_init(X3D_Viewer *viewer, int type);
273
274void viewer_getview(double *viewMatrix);
275
276void print_viewer();
277int fwl_get_headlight();
278void fwl_toggle_headlight();
279//int use_keys(void);
280
281void set_eyehalf( const double eyehalf, const double eyehalfangle);
282void resolve_pos(void);
283void getViewpointExamineDistance(void);
284
285void xy2qua(Quaternion *ret,
286 const double x,
287 const double y);
288
289void viewer_togl( double fieldofview);
290
291void handle(const int mev, const unsigned int button, const float x, const float y);
292void handle_key(const char key, double keytime);
293void handle_keyrelease (const char key, double keytime);
294void handle_tick();
295void set_stereo_offset0(); /*int iside, double eyehalf, double eyehalfangle);*/
296
297void increment_pos( struct point_XYZ *vec);
298
299void bind_Viewpoint(struct X3D_Viewpoint *node);
300void bind_OrthoViewpoint(struct X3D_OrthoViewpoint *node);
301void bind_GeoViewpoint(struct X3D_GeoViewpoint *node);
302void bind_Fog(struct X3D_Fog *node);
303
304extern float eyedist;
305extern float screendist;
306
307void getCurrentSpeed(void);
308void getCurrentPosInModelB ();
309
310void toggle_collision(void);
311void viewer_lastP_clear(void);
312void avatar2BoundViewpointVerticalAvatar(GLDOUBLE *matA2BVVA, GLDOUBLE *matBVVA2A);
313
314void toggleOrSetStereo(int type);
315void setAnaglyphSideColor(char val, int iside);
316void updateEyehalf(void);
317void viewer_level_to_bound(void);
318void viewer_viewall();
319int getAnaglyphPrimarySide(int primary, int iside);
320void setAnaglyphPrimarySide(int primary, int iside);
321int viewer_getKeyChord();
322void viewer_setKeyChord(int chord);
323
324void handle0(const int mev, const unsigned int button, const float x, const float yup);
325
326#endif /* __FREEWRL_VIEWER_H__ */
Definition Viewer.h:141