Coin Logo http://www.sim.no
http://www.coin3d.org

SoCamera.h

00001 #ifndef COIN_SOCAMERA_H
00002 #define COIN_SOCAMERA_H
00003 
00004 /**************************************************************************\
00005  *
00006  *  This file is part of the Coin 3D visualization library.
00007  *  Copyright (C) 1998-2007 by Systems in Motion.  All rights reserved.
00008  *
00009  *  This library is free software; you can redistribute it and/or
00010  *  modify it under the terms of the GNU General Public License
00011  *  ("GPL") version 2 as published by the Free Software Foundation.
00012  *  See the file LICENSE.GPL at the root directory of this source
00013  *  distribution for additional information about the GNU GPL.
00014  *
00015  *  For using Coin with software that can not be combined with the GNU
00016  *  GPL, and for taking advantage of the additional benefits of our
00017  *  support services, please contact Systems in Motion about acquiring
00018  *  a Coin Professional Edition License.
00019  *
00020  *  See http://www.coin3d.org/ for more information.
00021  *
00022  *  Systems in Motion, Postboks 1283, Pirsenteret, 7462 Trondheim, NORWAY.
00023  *  http://www.sim.no/  sales@sim.no  coin-support@coin3d.org
00024  *
00025 \**************************************************************************/
00026 
00027 #include <Inventor/nodes/SoSubNode.h>
00028 #include <Inventor/SbViewportRegion.h>
00029 #include <Inventor/SbViewVolume.h>
00030 #include <Inventor/fields/SoSFRotation.h>
00031 #include <Inventor/fields/SoSFEnum.h>
00032 #include <Inventor/fields/SoSFVec3f.h>
00033 #include <Inventor/fields/SoSFFloat.h>
00034 
00035 #include <Inventor/SbVec3f.h>
00036 #include <Inventor/SbBox3f.h>
00037 
00038 #define SO_ASPECT_SQUARE        1.0f
00039 #define SO_ASPECT_VIDEO         (4.0f/3.0f)
00040 #define SO_ASPECT_35mm_ACADEMY  1.371
00041 #define SO_ASPECT_16mm          1.369
00042 #define SO_ASPECT_35mm_FULL     1.33333
00043 #define SO_ASPECT_70mm          2.287
00044 #define SO_ASPECT_CINEMASCOPE   2.35
00045 #define SO_ASPECT_HDTV          (16.0f/9.0f)
00046 #define SO_ASPECT_PANAVISION    2.361
00047 #define SO_ASPECT_35mm          (3.0f/2.0f)
00048 #define SO_ASPECT_VISTAVISION   2.301
00049 
00050 class SoPath;
00051 
00052 class SoCameraP;
00053 
00054 class COIN_DLL_API SoCamera : public SoNode {
00055   typedef SoNode inherited;
00056 
00057   SO_NODE_ABSTRACT_HEADER(SoCamera);
00058 
00059 public:
00060   static void initClass(void);
00061 
00062   enum ViewportMapping {
00063     CROP_VIEWPORT_FILL_FRAME,
00064     CROP_VIEWPORT_LINE_FRAME,
00065     CROP_VIEWPORT_NO_FRAME,
00066     ADJUST_CAMERA,
00067     LEAVE_ALONE
00068   };
00069 
00070   SoSFEnum viewportMapping;
00071   SoSFVec3f position;
00072   SoSFRotation orientation;
00073   SoSFFloat aspectRatio;
00074   SoSFFloat nearDistance;
00075   SoSFFloat farDistance;
00076   SoSFFloat focalDistance;
00077 
00078   void pointAt(const SbVec3f & targetpoint);
00079   void pointAt(const SbVec3f & targetpoint, const SbVec3f & upvector);
00080   virtual void scaleHeight(float scalefactor) = 0;
00081   virtual SbViewVolume getViewVolume(float useaspectratio = 0.0f) const = 0;
00082   void viewAll(SoNode * const sceneroot, const SbViewportRegion & vpregion,
00083                const float slack = 1.0f);
00084   void viewAll(SoPath * const path, const SbViewportRegion & vpregion,
00085                const float slack = 1.0f);
00086   SbViewportRegion getViewportBounds(const SbViewportRegion & region) const;
00087 
00088   enum StereoMode {
00089     MONOSCOPIC,
00090     LEFT_VIEW,
00091     RIGHT_VIEW
00092   };
00093 
00094   void setStereoMode(StereoMode mode);
00095   StereoMode getStereoMode(void) const;
00096 
00097   void setStereoAdjustment(float adjustment);
00098   float getStereoAdjustment(void) const;
00099   void setBalanceAdjustment(float adjustment);
00100   float getBalanceAdjustment(void) const;
00101 
00102   virtual void doAction(SoAction * action);
00103   virtual void callback(SoCallbackAction * action);
00104   virtual void GLRender(SoGLRenderAction * action);
00105   virtual void audioRender(SoAudioRenderAction *action);
00106   virtual void getBoundingBox(SoGetBoundingBoxAction * action);
00107   virtual void handleEvent(SoHandleEventAction * action);
00108   virtual void rayPick(SoRayPickAction * action);
00109   virtual void getPrimitiveCount(SoGetPrimitiveCountAction * action);
00110 
00111 protected:
00112   SoCamera(void);
00113   virtual ~SoCamera();
00114 
00115   virtual void viewBoundingBox(const SbBox3f & box, float aspect,
00116                                float slack) = 0;
00117   virtual void jitter(int numpasses, int curpass,
00118                       const SbViewportRegion & vpreg,
00119                       SbVec3f & jitteramount) const;
00120 
00121 private:
00122   void getView(SoAction * action, SbViewVolume & resultvv,
00123                SbViewportRegion & resultvp,
00124                const SbBool considermodelmatrix = TRUE);
00125 
00126   void drawCroppedFrame(SoGLRenderAction * action,
00127                         const int viewportmapping,
00128                         const SbViewportRegion & oldvp,
00129                         const SbViewportRegion & newvp);
00130 
00131   void lookAt(const SbVec3f & dir, const SbVec3f & up);
00132 
00133   StereoMode stereomode;
00134   float stereoadjustment;
00135   float balanceadjustment;
00136 private:
00137   SoCameraP *pimpl;
00138   friend class SoCameraP;
00139 };
00140 
00141 #endif // !COIN_SOCAMERA_H

Copyright © 1998-2007 by Systems in Motion AS. All rights reserved.

Generated on Mon Feb 23 16:33:13 2009 for Coin by Doxygen. 1.5.8