Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members | Related Pages

Cameras.h

Go to the documentation of this file.
00001 /*
00002  * Cameras.h
00003  *
00004  * Part of Fly! Legacy project
00005  *
00006  * Copyright 2003 Chris Wallace
00007  *
00008  * Fly! Legacy is free software; you can redistribute it and/or modify
00009  *   it under the terms of the GNU General Public License as published by
00010  *   the Free Software Foundation; either version 2 of the License, or
00011  *   (at your option) any later version.
00012  *
00013  * Fly! Legacy is distributed in the hope that it will be useful,
00014  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016  *   GNU General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU General Public License
00019  *   along with Fly! Legacy; if not, write to the Free Software
00020  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00021  *
00022  */
00023 
00034 #ifndef CAMERAS_H_
00035 #define CAMERAS_H_
00036 
00037 
00038 #include "FlyLegacy.h"
00039 #include <map>
00040 
00041 
00042 //
00043 // Abstract class common to all cameras.  All subclasses must implement the
00044 //   mandatory UpdateCamera method
00045 //
00046 class CCamera : public CStreamObject {
00047 public:
00048   // Constructors
00049   CCamera (void);
00050   virtual ~CCamera (void) {}
00051 
00052   // CStreamObject methods
00053   virtual int   Read (SStream *stream, Tag tag)
00054   {
00055     return TAG_IGNORED;
00056   }
00057 
00058   // CCamera methods
00059 
00060   //
00061   // The Activate() method is called when a specific camera instance is
00062   //   activated by the CCameraManager
00063   //
00064 //  virtual void  Activate (void) = 0;
00065 
00066   // UpdateCamera is a pure virtual method and therefore must be implemented by
00067   //   all descended classes.  The position and orientation of the target
00068   //   object are supplied in the targetPosition and targetOrientation arguments;
00069   //   these should never be updated.  The eyePosition and eyeOrientation parameters
00070   //   should be updated with the camera's position and orientation.
00071   //
00072   virtual void GetCameraOffset (SVector *v);
00073   virtual void GetCameraOrientation (SVector *v);
00074   virtual void UpdateCamera (SPosition *targetPosition, SVector *targetOrientation,
00075                            SPosition *eyePosition, SVector *eyeOrientation,
00076                  const float dT);
00077   virtual float GetFOV (void);
00078   virtual Tag   GetCameraType (void) { return CAMERA_INVALID; }
00079   virtual void  GetCameraName (char* name, int maxLength)
00080   {
00081     strncpy (name, "Invalid Camera", maxLength);
00082   }
00083   virtual int   IsInteriorCamera (void) { return 0; }
00084 
00085   // Camera FOV manipulation methods.
00086   virtual void  ZoomRatioIn (void);
00087   virtual void  ZoomRatioOut (void);
00088   virtual void  ZoomIn (void);
00089   virtual void  ZoomInSlow (void);
00090   virtual void  ZoomInFast (void);
00091   virtual void  ZoomOut (void);
00092   virtual void  ZoomOutSlow (void);
00093   virtual void  ZoomOutFast (void);
00094   virtual void  ZoomReset (void);
00095 
00096   // Camera position manipulation methods.  These do nothing by default, specific
00097   //   camera subclasses must implement them
00098   virtual void  PanLeft (void) {}
00099   virtual void  PanRight (void) {}
00100   virtual void  PanUp (void) {}
00101   virtual void  PanDown (void) {}
00102 
00103   // User position methods.  These are traditionally implemented just for the
00104   //   cockpit camera, though there's no reason why they couldn't be implemented
00105   //   for external cameras as well.
00106   virtual void  User1 (void) {}
00107   virtual void  DefineUser1 (void) {}
00108   virtual void  User2 (void) {}
00109   virtual void  DefineUser2 (void) {}
00110   virtual void  User3 (void) {}
00111   virtual void  DefineUser3 (void) {}
00112   virtual void  User4 (void) {}
00113   virtual void  DefineUser4 (void) {}
00114   virtual void  User5 (void) {}
00115   virtual void  DefineUser5 (void) {}
00116   virtual void  User6 (void) {}
00117   virtual void  DefineUser6 (void) {}
00118   virtual void  User7 (void) {}
00119   virtual void  DefineUser7 (void) {}
00120   virtual void  User8 (void) {}
00121   virtual void  DefineUser8 (void) {}
00122   virtual void  HeadPitchUp (void) {}
00123   virtual void  HeadPitchDown (void) {}
00124 
00125 protected:
00126   float     fov;        // Field of view in degrees
00127   float     h, p;       // Heading and pitch
00128   float     r;          // Range
00129   float     rmin, rmax; // Min/max range
00130   SVector   orientation;
00131 };
00132 
00133 
00134 //
00135 // This class represents a single instance of a cockpit panel within a cockpit
00136 //   camera definition.  Members include the unique ID tag of the panel,
00137 //   the orientation of the eye position when that panel is active, and
00138 //   a list of which panel ID tags are situated to the left, right, up and down
00139 //   from the panel.
00140 //
00141 // Example:
00142 //
00143 //    <panl> ---- panel ----
00144 //    <bgno> ---- begin ----
00145 //      <id__> ---- id ----
00146 //      frnt
00147 //      <main> ---- default ----
00148 //      <hdg_> ---- heading ----
00149 //      0.0
00150 //      <ptch> ---- pitch ----
00151 //      7.4
00152 //      <pnls> ---- panels (L,R,U,D) ----
00153 //      uplt
00154 //      uprt
00155 //      NONE
00156 //      floo
00157 //    <endo> ---- end ----
00158 //
00159 
00160 class CCockpitPanel : public CStreamObject {
00161 public:
00162   CCockpitPanel (void);
00163 
00164   // CStreamObject methods
00165   int   Read (SStream *stream, Tag tag);
00166 
00167 public:
00168   Tag     id;       // Panel ID, as specified in a PNL file
00169   bool    main;     // Is this the main (default) panel?
00170   float   hdg;      // Viewpoint heading (y-axis rotation)
00171   float   pitch;      // Viewpoint pitch (x-axis rotation)
00172   Tag     pnls[4];    // Links to IDs of other panels in cockpit
00173   float   ofst_x;     // Exterior render offset
00174   float   ofst_y;
00175   float   ofst_z;
00176   float   xscr_x;     // Exterior scroll factor
00177   float   xscr_y;
00178   int     umdl;     // Use exterior model
00179 };
00180 
00181 
00182 
00183 //
00184 // Cockpit (vehicle interior) camera
00185 //
00186 class CCameraCockpit : public CCamera {
00187 public:
00188   CCameraCockpit (void);
00189   virtual ~CCameraCockpit (void);
00190 
00191   // CStreamObject methods
00192   virtual int     Read (SStream *stream, Tag tag);
00193   virtual void    ReadFinished (void);
00194 
00195   // CCamera methods
00196   virtual void  GetCameraOffset (SVector *v);
00197   virtual void  GetCameraOrientation (SVector *v);
00198   virtual Tag   GetCameraType (void) { return CAMERA_COCKPIT; }
00199   virtual void  GetCameraName (char* name, int maxLength)
00200   {
00201     strncpy (name, "Cockpit Camera", maxLength);
00202   }
00203   virtual int  IsInteriorCamera (void) { return 1; }
00204 
00205   virtual void  PanLeft (void);
00206   virtual void  PanRight (void);
00207   virtual void  PanUp (void);
00208   virtual void  PanDown (void);
00209 
00210   virtual void  User1 (void);
00211   virtual void  User2 (void);
00212   virtual void  User3 (void);
00213   virtual void  User4 (void);
00214   virtual void  User5 (void);
00215   virtual void  User6 (void);
00216   virtual void  User7 (void);
00217   virtual void  User8 (void);
00218   virtual void  DefineUser1 (void);
00219   virtual void  DefineUser2 (void);
00220   virtual void  DefineUser3 (void);
00221   virtual void  DefineUser4 (void);
00222   virtual void  DefineUser5 (void);
00223   virtual void  DefineUser6 (void);
00224   virtual void  DefineUser7 (void);
00225   virtual void  DefineUser8 (void);
00226   virtual void  HeadPitchUp (void);
00227   virtual void  HeadPitchDown (void);
00228 
00229   // CCameraCockpit methods
00230   Tag       GetCockpitPanel (void);
00231   void      ActivateCockpitPanel (Tag tag);
00232 
00233 private:
00234   CCockpitPanel*  FindCockpitPanel (Tag tag);
00235 
00236 protected:
00237   // Data members
00238   SVector   seat_hpr;   // Orientation of cockpit seat
00239   SVector   seat_xyz;   // Position of cockpit seat wrt model center
00240   std::map<Tag,CCockpitPanel*> panl;
00241 
00242   // Pointer to CCockpitPanel of currently active panel
00243   CCockpitPanel*  pCockpitPanel;
00244 };
00245 
00246 
00247 //
00248 // External spot camera
00249 //
00250 class CCameraSpot : public CCamera {
00251 public:
00252   // Constructors/Destructors
00253   CCameraSpot (void);
00254 
00255   // CCamera methods
00256   virtual void GetCameraOffset (SVector *v);
00257   virtual void GetCameraOrientation (SVector *v);
00258 
00259   virtual Tag   GetCameraType (void) { return CAMERA_SPOT; }
00260   virtual void  GetCameraName (char* name, int maxLength)
00261   {
00262     strncpy (name, "External Camera", maxLength);
00263   }
00264   virtual int   IsInteriorCamera (void) { return 0; }
00265 
00266   virtual void  PanLeft (void);
00267   virtual void  PanRight (void);
00268   virtual void  PanUp (void);
00269   virtual void  PanDown (void);
00270 
00271 protected:
00272   float     theta, phi;
00273 };
00274 
00275 
00276 //
00277 // External observer camera
00278 //
00279 class CCameraObserver : public CCamera {
00280 public:
00281   // Constructors/Destructors
00282   CCameraObserver (void);
00283 
00284   // CCamera methods
00285   virtual void GetCameraOffset (SVector *v);
00286   virtual void GetCameraOrientation (SVector *v);
00287 
00288   virtual Tag   GetCameraType (void) { return CAMERA_OBSERVER; }
00289   virtual void  GetCameraName (char* name, int maxLength)
00290   {
00291     strncpy (name, "Observer Camera", maxLength);
00292   }
00293   virtual int   IsInteriorCamera (void) { return 0; }
00294 
00295   virtual void  PanLeft (void);
00296   virtual void  PanRight (void);
00297   virtual void  PanUp (void);
00298   virtual void  PanDown (void);
00299 
00300 protected:
00301   float     theta, phi;
00302 };
00303 
00304 
00305 //
00306 // External fly-by camera
00307 //
00308 class CCameraFlyby : public CCamera {
00309 public:
00310   // CCamera methods
00311   virtual void GetCameraOffset (SVector *v);
00312   virtual void GetCameraOrientation (SVector *v);
00313 
00314   virtual Tag   GetCameraType (void)
00315   {
00316     return CAMERA_FLYBY;
00317   }
00318 
00319   virtual void  GetCameraName (char* name, int maxLength)
00320   {
00321     strncpy (name, "Fly-by Camera", maxLength);
00322   }
00323 
00324   virtual int   IsInteriorCamera (void)
00325   {
00326     return 0; // False for exterior camera
00327   }
00328 
00329 
00330 /*
00331   virtual void  PanLeft (void);
00332   virtual void  PanRight (void);
00333   virtual void  PanUp (void);
00334   virtual void  PanDown (void);
00335 */
00336 };
00337 
00338 //
00339 // External tower camera
00340 //
00341 // When selected, the eyepoint for this camera is placed a the nearest
00342 //   airport tower location.
00343 //
00344 class CCameraTower : public CCamera {
00345 public:
00346   // CCamera methods
00347   virtual void GetCameraOffset (SVector *v);
00348   virtual void GetCameraOrientation (SVector *v);
00349 
00350   virtual Tag   GetCameraType (void)
00351   {
00352     return CAMERA_TOWER;
00353   }
00354 
00355   virtual void  GetCameraName (char* name, int maxLength)
00356   {
00357     strncpy (name, "Tower Camera", maxLength);
00358   }
00359 
00360   virtual int   IsInteriorCamera (void)
00361   {
00362     return 0; // False for exterior camera
00363   }
00364 
00365 
00366 /*
00367   virtual void  PanLeft (void);
00368   virtual void  PanRight (void);
00369   virtual void  PanUp (void);
00370   virtual void  PanDown (void);
00371 */
00372 };
00373 
00374 
00375 //
00376 // Overhead camera
00377 //
00378 // When selected, the eyepoint for this camera is placed above the aircraft
00379 //   looking down towards the ground.
00380 //
00381 class CCameraOverhead : public CCamera {
00382 public:
00383   virtual void GetCameraOffset (SVector *v);
00384   virtual void GetCameraOrientation (SVector *v);
00385 
00386   virtual Tag   GetCameraType (void)
00387   {
00388     return CAMERA_OVERHEAD;
00389   }
00390 
00391   virtual void  GetCameraName (char* name, int maxLength)
00392   {
00393     strncpy (name, "Overhead Camera", maxLength);
00394   }
00395 
00396   virtual int   IsInteriorCamera (void)
00397   {
00398     return 0; // False for exterior camera
00399   }
00400 };
00401 
00402 
00403 #endif // CAMERAS_H_
00404 
SourceForge.net Logo Documentation generated by doxygen