00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #ifndef _STEREOMANAGER_H_
00037 #define _STEREOMANAGER_H_
00038
00039 #include "Ogre.h"
00040 #include <map>
00041
00056 namespace Ogre
00057 {
00058 class StereoManager
00059 {
00060 public:
00061 enum StereoMode
00062 {
00063 SM_NONE,
00065 SM_ANAGLYPH_RC,
00067 SM_ANAGLYPH_YB,
00069 SM_DUALOUTPUT,
00071 SM_INTERLACED_V,
00073 SM_INTERLACED_H,
00075 SM_INTERLACED_CB,
00076
00077
00079 SM_LIMIT
00080
00081 };
00082
00083 struct StereoModeDescription
00084 {
00085 StereoModeDescription() {}
00086 StereoModeDescription(const String &name) :
00087 mName(name), mUsesCompositor(false), mMaterialName("") {}
00088 StereoModeDescription(const String &name, const String &materialName) :
00089 mName(name), mUsesCompositor(true), mMaterialName(materialName) {}
00090 StereoModeDescription &operator=(const StereoModeDescription &desc)
00091 {
00092 mName = desc.mName;
00093 mMaterialName = desc.mMaterialName;
00094 mUsesCompositor = desc.mUsesCompositor;
00095 return *this;
00096 }
00097 String mName;
00098 String mMaterialName;
00099 bool mUsesCompositor;
00100 };
00101
00102 typedef std::map<StereoMode, StereoModeDescription> StereoModeList;
00103
00104 protected:
00105 class StereoCameraListener : public RenderTargetListener
00106 {
00107 Vector3 mOldPos;
00108 Vector2 mOldOffset;
00109 uint32 mOldVisibilityMask;
00110 StereoManager *mStereoMgr;
00111 Camera *mCamera;
00112 Viewport *mViewport;
00113 public:
00114 bool mIsLeftEye;
00115 void init(StereoManager *stereoMgr, Viewport *viewport, bool isLeftCamera);
00116
00117
00118 virtual void preViewportUpdate (const RenderTargetViewportEvent &evt);
00119 virtual void postViewportUpdate (const RenderTargetViewportEvent &evt);
00120 };
00121 friend class StereoCameraListener;
00122
00123 class DeviceLostListener : public RenderSystem::Listener
00124 {
00125 StereoManager *mStereoMgr;
00126 public:
00127 void init(StereoManager *stereoMgr);
00128 virtual void eventOccurred (const String &eventName, const NameValuePairList *parameters);
00129 };
00130 friend class DeviceLostListener;
00131
00132 Camera *mCamera;
00133 StereoCameraListener mLeftCameraListener, mRightCameraListener;
00134 DeviceLostListener mDeviceLostListener;
00135 Viewport *mLeftViewport, *mRightViewport;
00136 uint32 mLeftMask, mRightMask;
00137 CompositorInstance *mCompositorInstance;
00138
00139
00140 StereoModeList mAvailableModes;
00141 StereoMode mStereoMode;
00142 Real mEyesSpacing;
00143 Real mFocalLength;
00144 bool mFocalLengthInfinite;
00145 bool mIsFocalPlaneFixed;
00146 Real mScreenWidth;
00147 bool mIsInversed;
00148 bool mIsCustomProjection;
00149 Matrix4 mLeftCustomProjection, mRightCustomProjection;
00150
00151
00152
00153 bool mAreOverlaysEnabled;
00154 Viewport *mCompositorViewport;
00155
00156
00157 typedef std::map<RenderTarget *, bool> RenderTargetList;
00158
00159 RenderTargetList mRenderTargetList;
00160
00161
00162 SceneManager *mSceneMgr;
00163 Entity *mDebugPlane;
00164 SceneNode *mDebugPlaneNode;
00165 String mLeftMaterialName, mRightMaterialName;
00166
00167
00168 void initCompositor(Viewport *viewport, const String &materialName, Viewport *&out_left, Viewport *&out_right);
00169 void shutdownCompositor(void);
00170 void initListeners(Viewport* leftViewport, Viewport* rightViewport);
00171 void shutdownListeners(void);
00172
00173 void updateCamera(Real delta);
00174
00175 void init(Viewport* leftViewport, Viewport* rightViewport);
00176
00177 void updateAllDependentRenderTargets(bool isLeftEye);
00178 void chooseDebugPlaneMaterial(bool isLeftEye);
00179
00180 public:
00181
00182 StereoManager(void);
00183 ~StereoManager(void);
00191 void init(Viewport* leftViewport, Viewport* rightViewport, const String &fileName);
00192 void init(Viewport* leftViewport, Viewport* rightViewport, StereoMode mode);
00193
00195 void shutdown(void);
00196
00197
00202 void addRenderTargetDependency(RenderTarget *renderTarget);
00203 void removeRenderTargetDependency(RenderTarget *renderTarget);
00204
00205
00211 void createDebugPlane(SceneManager *sceneMgr, const String &leftMaterialName = "", const String &rightMaterialName = "");
00212 void destroyDebugPlane(void);
00213 void enableDebugPlane(bool enable);
00214 void toggleDebugPlane(void);
00215 void updateDebugPlane(void);
00216
00217
00218 inline StereoMode getStereoMode(void) const {return mStereoMode;}
00219
00220 inline Camera *getCamera(void) const {return mCamera;}
00221 inline void setCamera(Camera *cam) {mCamera = cam;}
00222
00223 inline Real getEyesSpacing(void) const {return mEyesSpacing;}
00224 inline void setEyesSpacing(Real l) {mEyesSpacing = l;}
00225
00228 void setFocalLength(Real l);
00229
00232 Real getFocalLength(void) const;
00233
00237 void setFocalLengthInfinite(bool isInfinite = true);
00238 inline bool isFocalLengthInfinite(void) const { return mFocalLengthInfinite; }
00239
00250 inline void fixFocalPlanePos(bool fix) {mIsFocalPlaneFixed = fix;}
00251 inline void setScreenWidth(Real w) {mScreenWidth = w;}
00252 void useScreenWidth(Real w);
00253
00255 void setCustomProjectonMatrices(bool enable, const Matrix4 &leftMatrix, const Matrix4 &rightMatrix);
00256 void getCustomProjectonMatrices(bool &enabled, Matrix4 &leftMatrix, Matrix4 &rightMatrix) const;
00257
00259 void inverseStereo(bool inverse);
00260 bool isStereoInversed(void) const {return mIsInversed;}
00261
00267 void setVisibilityMask(uint32 leftMask, uint32 rightMask);
00268 void getVisibilityMask(uint32 &outLeftMask, uint32 &outRightMask) const;
00269
00273 Viewport *getLeftViewport(void) const { return mLeftViewport; }
00274 Viewport *getRightViewport(void) const { return mRightViewport; }
00275
00276
00279 void saveConfig(const String &filename) const;
00280 StereoMode loadConfig(const String &filename);
00281 };
00282 }
00283
00284 #endif