OpenMW
apps/openmw/mwrender/ripplesimulation.hpp
Go to the documentation of this file.
00001 #ifndef RIPPLE_SIMULATION_H
00002 #define RIPPLE_SIMULATION_H
00003 
00004 #include <OgreTexture.h>
00005 #include <OgreMaterial.h>
00006 #include <OgreVector2.h>
00007 #include <OgreVector3.h>
00008 
00009 #include "../mwworld/ptr.hpp"
00010 
00011 namespace Ogre
00012 {
00013     class RenderTexture;
00014     class Camera;
00015     class SceneManager;
00016     class Rectangle2D;
00017 }
00018 
00019 namespace MWRender
00020 {
00021 
00022 struct Emitter
00023 {
00024     MWWorld::Ptr mPtr;
00025     Ogre::Vector3 mLastEmitPosition;
00026     float mScale;
00027     float mForce;
00028 };
00029 
00030 class RippleSimulation
00031 {
00032 public:
00033     RippleSimulation(Ogre::SceneManager* mainSceneManager);
00034     ~RippleSimulation();
00035 
00036     void update(float dt, Ogre::Vector2 position);
00037 
00039     void addEmitter (const MWWorld::Ptr& ptr, float scale = 1.f, float force = 1.f);
00040     void removeEmitter (const MWWorld::Ptr& ptr);
00041     void updateEmitterPtr (const MWWorld::Ptr& old, const MWWorld::Ptr& ptr);
00042 
00043 private:
00044     std::vector<Emitter> mEmitters;
00045 
00046     Ogre::RenderTexture* mRenderTargets[4];
00047     Ogre::TexturePtr mTextures[4];
00048 
00049     int mTextureSize;
00050     float mRippleAreaLength;
00051     float mImpulseSize;
00052 
00053     bool mFirstUpdate;
00054 
00055     Ogre::Camera* mCamera;
00056 
00057     // own scenemanager to render our simulation
00058     Ogre::SceneManager* mSceneMgr;
00059     Ogre::Rectangle2D* mRectangle;
00060 
00061     // scenemanager to create the debug overlays on
00062     Ogre::SceneManager* mMainSceneMgr;
00063 
00064     static const int TEX_NORMAL = 3;
00065 
00066     Ogre::Rectangle2D* mImpulse;
00067 
00068     void addImpulses();
00069     void heightMapToNormalMap();
00070     void waterSimulation();
00071     void swapHeightMaps();
00072 
00073     float mTime;
00074 
00075     Ogre::Vector2 mRippleCenter;
00076 
00077     Ogre::Vector2 mTexelOffset;
00078 
00079     Ogre::Vector2 mCurrentFrameOffset;
00080     Ogre::Vector2 mPreviousFrameOffset;
00081 };
00082 
00083 }
00084 
00085 #endif