OpenMW
|
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