#ifndef MAT_WATER_H #define MAT_WATER_H #include class App; class Water : public Ogre::FrameListener, Ogre::RenderTargetListener { Ogre::SceneManager *mScnMgr; Ogre::RenderWindow * mWindow; Ogre::SceneNode *mWaterNode, *mCameraNode; Ogre::Vector3 mCameraPosition; Ogre::Camera *mCamera; Ogre::Plane mWaterPlane, mReflectionPlane, mReflectionClipPlaneAbove, mReflectionClipPlaneBelow, mRefractionClipPlaneAbove, mRefractionClipPlaneBelow; bool mAbove; std::vector mWaterMeshes; // Reflection Ogre::RenderTexture * mReflectionTexture; Ogre::Camera * mReflectionCamera; // Refraction Ogre::RenderTexture * mRefractionTexture; Ogre::Camera * mRefractionCamera; bool mInRefTexUpdate; Ogre::Timer mtexture_dump; void create_cameras(); public: Water(); virtual ~Water(); void create_textures(); void dump_textures(); void createWater(Ogre::RenderWindow * window, Ogre::Camera *camera); void init(); void updateWater(float delta); bool frameEnded(const Ogre::FrameEvent &evt) override; bool frameRenderingQueued(const Ogre::FrameEvent &evt) override; void preRenderTargetUpdate(const Ogre::RenderTargetEvent &evt) override; void postRenderTargetUpdate(const Ogre::RenderTargetEvent &evt) override; void add_submerged_entity(Ogre::Entity *ent); void add_surface_entity(Ogre::Entity *ent); }; #endif