Open Inventor Reference
|
00001 /* 00002 * 00003 * Copyright (C) 2000 Silicon Graphics, Inc. All Rights Reserved. 00004 * 00005 * This library is free software; you can redistribute it and/or 00006 * modify it under the terms of the GNU Lesser General Public 00007 * License as published by the Free Software Foundation; either 00008 * version 2.1 of the License, or (at your option) any later version. 00009 * 00010 * This library is distributed in the hope that it will be useful, 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 * Lesser General Public License for more details. 00014 * 00015 * Further, this software is distributed without any warranty that it is 00016 * free of the rightful claim of any third person regarding infringement 00017 * or the like. Any license provided herein, whether implied or 00018 * otherwise, applies only to this software file. Patent licenses, if 00019 * any, provided herein do not apply to combinations of this program with 00020 * other software, or any other product whatsoever. 00021 * 00022 * You should have received a copy of the GNU Lesser General Public 00023 * License along with this library; if not, write to the Free Software 00024 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00025 * 00026 * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, 00027 * Mountain View, CA 94043, or: 00028 * 00029 * http://www.sgi.com 00030 * 00031 * For further information regarding this notice, see: 00032 * 00033 * http://oss.sgi.com/projects/GenInfo/NoticeExplan/ 00034 * 00035 */ 00036 00037 00038 /* 00039 * Copyright (C) 1990,91 Silicon Graphics, Inc. 00040 * 00041 _______________________________________________________________________ 00042 ______________ S I L I C O N G R A P H I C S I N C . ____________ 00043 | 00044 | $Revision: 1.1.1.1 $ 00045 | 00046 | Description: 00047 | Abstract base camera node class 00048 | 00049 | Author(s) : Paul S. Strauss 00050 | 00051 ______________ S I L I C O N G R A P H I C S I N C . ____________ 00052 _______________________________________________________________________ 00053 */ 00054 00055 #ifndef _SO_CAMERA_ 00056 #define _SO_CAMERA_ 00057 00058 #include <Inventor/SbBox.h> 00059 #include <Inventor/SbViewportRegion.h> 00060 #include <Inventor/nodes/SoSubNode.h> 00061 #include <Inventor/fields/SoSFFloat.h> 00062 #include <Inventor/fields/SoSFRotation.h> 00063 #include <Inventor/fields/SoSFVec3f.h> 00064 #include <Inventor/fields/SoSFEnum.h> 00065 00066 class SbViewportRegion; 00067 00068 00071 00094 00095 00096 class INVENTOR_API SoCamera : public SoNode { 00097 00098 SO_NODE_ABSTRACT_HEADER(SoCamera); 00099 00100 public: 00102 enum ViewportMapping { 00104 00107 CROP_VIEWPORT_FILL_FRAME = 0, 00108 CROP_VIEWPORT_LINE_FRAME = 1, 00109 CROP_VIEWPORT_NO_FRAME = 2, 00110 00111 ADJUST_CAMERA = 3, 00112 LEAVE_ALONE = 4 00113 00114 }; 00115 00120 00122 00123 00126 SoSFEnum viewportMapping; 00127 00129 SoSFVec3f position; 00130 00133 SoSFRotation orientation; 00134 00138 SoSFFloat aspectRatio; 00140 SoSFFloat nearDistance; 00142 SoSFFloat farDistance; 00143 00147 SoSFFloat focalDistance; 00148 00150 00155 void pointAt(const SbVec3f &targetPoint); 00156 00160 virtual void scaleHeight(float scaleFactor) = 0; 00161 00165 virtual SbViewVolume getViewVolume(float useAspectRatio = 0.0) const = 0; 00166 00172 void viewAll(SoNode *sceneRoot, 00173 const SbViewportRegion &vpRegion, 00174 float slack = 1.0); 00175 void viewAll(SoPath *path, 00176 const SbViewportRegion &vpRegion, 00177 float slack = 1.0); 00178 00181 SbViewportRegion getViewportBounds(const SbViewportRegion ®ion) const; 00182 00183 SoEXTENDER public: 00184 virtual void doAction(SoAction *action); 00185 virtual void callback(SoCallbackAction *action); 00186 virtual void GLRender(SoGLRenderAction *action); 00187 virtual void getBoundingBox(SoGetBoundingBoxAction *action); 00188 virtual void handleEvent(SoHandleEventAction *action); 00189 virtual void rayPick(SoRayPickAction *action); 00190 00191 SoINTERNAL public: 00192 static void initClass(); 00193 00194 protected: 00195 SoCamera(); 00196 virtual ~SoCamera(); 00197 00202 virtual void viewBoundingBox(const SbBox3f &box, 00203 float aspect, float slack) = 0; 00204 00208 virtual void jitter(int numPasses, int curPass, 00209 const SbViewportRegion &vpReg, 00210 SbVec3f &jitterAmount) const; 00211 00212 private: 00214 void computeView(const SbViewportRegion &vpReg, 00215 SbViewVolume &viewVol, 00216 SbBool &changeRegion); 00217 00219 void setElements(SoAction *action, 00220 SbViewVolume &viewVol, 00221 SbBool setRegion, 00222 const SbViewportRegion &vpReg, 00223 SbBool doJitter, 00224 const SbVec3f &jitterAmount); 00225 00227 void drawFrame(SoGLRenderAction *action, 00228 const SbViewportRegion &vpReg, 00229 const SbViewportRegion &croppedReg); 00230 00232 static void getJitterSample(int numPasses, int curPass, 00233 SbVec2f &samplePoint); 00234 }; 00235 00240 00241 #define SO_ASPECT_SQUARE 1.00 /* Square (1.000) */ 00242 #define SO_ASPECT_VIDEO 1.333333333 /* Video (0.75) */ 00243 #define SO_ASPECT_35mm_ACADEMY 1.371 /* 35mm, Academy ap (.72939460) */ 00244 #define SO_ASPECT_16mm 1.369 /* 16mm cinema (.730460189) */ 00245 #define SO_ASPECT_35mm_FULL 1.33333 /* 35mm cinema, full ap (0.75) */ 00246 #define SO_ASPECT_70mm 2.287 /* 70 mm unsqueezed (.43725404) */ 00247 #define SO_ASPECT_CINEMASCOPE 2.35 /* Cinemascope (.425531914) */ 00248 #define SO_ASPECT_HDTV 1.777777777 /* HDTV (16:9) */ 00249 #define SO_ASPECT_PANAVISION 2.361 /* Panavision (.423549343) */ 00250 #define SO_ASPECT_35mm 1.5 /* 35mm still camera (.666666) */ 00251 #define SO_ASPECT_VISTAVISION 2.301 /* Vistavision (.434593654) */ 00252 00253 #endif /* _SO_CAMERA_ */