1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-01-16 07:49:56 +00:00
openmw-tes3mp/apps/openmw/mwrender/sky.hpp

159 lines
4.3 KiB
C++
Raw Normal View History

#ifndef _GAME_RENDER_SKY_H
#define _GAME_RENDER_SKY_H
#include <OgreVector3.h>
#include <OgreString.h>
#include <OgreMaterial.h>
#include <OgreColourValue.h>
#include <OgreHighLevelGpuProgram.h>
#include "sky.hpp"
#include "../mwworld/weather.hpp"
namespace Ogre
{
class RenderWindow;
class SceneNode;
class Camera;
class Viewport;
class SceneManager;
class Entity;
}
namespace MWRender
{
class CelestialBody
{
public:
CelestialBody( const Ogre::String& pTextureName,
const unsigned int pInitialSize,
const Ogre::Vector3& pInitialPosition,
Ogre::SceneNode* pRootNode
);
CelestialBody();
void setColour(const Ogre::ColourValue& pColour);
void setPosition(const Ogre::Vector3& pPosition);
void setVisible(const bool visible);
protected:
virtual void init(const Ogre::String& pTextureName,
const unsigned int pInitialSize,
const Ogre::Vector3& pInitialPosition,
Ogre::SceneNode* pRootNode);
Ogre::SceneNode* mNode;
Ogre::MaterialPtr mMaterial;
};
/*
* The moons need a seperate class because of their shader (which allows them to be partially transparent)
*/
class Moon : public CelestialBody
{
public:
Moon( const Ogre::String& pTextureName,
const unsigned int pInitialSize,
const Ogre::Vector3& pInitialPosition,
Ogre::SceneNode* pRootNode
);
void setVisibility(const float pVisibility);
///< set the transparency factor for this moon
2012-02-21 16:38:15 +00:00
enum Phase
{
Phase_New = 0,
Phase_WaxingCrescent,
Phase_WaxingHalf,
Phase_WaxingGibbous,
Phase_WaningCrescent,
Phase_WaningHalf,
Phase_WaningGibbous,
Phase_Full
};
2012-02-21 16:38:15 +00:00
enum Type
{
Type_Masser = 0,
Type_Secunda
};
void setPhase(const Phase& phase);
void setType(const Type& type);
Phase getPhase() const;
unsigned int getPhaseInt() const;
2012-02-21 16:38:15 +00:00
private:
Type mType;
Phase mPhase;
};
class SkyManager
{
public:
SkyManager(Ogre::SceneNode* pMwRoot, Ogre::Camera* pCamera);
2012-02-21 16:38:15 +00:00
~SkyManager();
2012-02-21 16:38:15 +00:00
void update(float duration);
2012-02-21 16:38:15 +00:00
void enable();
2012-02-21 16:38:15 +00:00
void disable();
2012-02-21 16:38:15 +00:00
void setHour (double hour) {}
///< will be called even when sky is disabled.
2012-02-21 16:38:15 +00:00
void setDate (int day, int month) {}
///< will be called even when sky is disabled.
2012-02-21 16:38:15 +00:00
int getMasserPhase() const;
///< 0 new moon, 1 waxing or waning cresecent, 2 waxing or waning half,
/// 3 waxing or waning gibbous, 4 full moon
2012-02-21 16:38:15 +00:00
int getSecundaPhase() const;
///< 0 new moon, 1 waxing or waning cresecent, 2 waxing or waning half,
/// 3 waxing or waning gibbous, 4 full moon
2012-02-21 16:38:15 +00:00
void setMoonColour (bool red);
///< change Secunda colour to red
2012-02-21 21:11:41 +00:00
void setCloudsOpacity(float opacity);
///< change opacity of the clouds
void setWeather(const MWWorld::WeatherResult& weather);
private:
CelestialBody* mSun;
Moon* mMasser;
Moon* mSecunda;
Ogre::Viewport* mViewport;
Ogre::SceneNode* mRootNode;
Ogre::SceneManager* mSceneMgr;
Ogre::MaterialPtr mCloudMaterial;
Ogre::MaterialPtr mAtmosphereMaterial;
Ogre::HighLevelGpuProgramPtr mCloudFragmentShader;
// remember the cloud texture names used right now, so we don't have to set the texture names if they didnt change
Ogre::String mClouds;
Ogre::String mNextClouds;
float mCloudBlendFactor;
float mCloudOpacity;
float mCloudSpeed;
Ogre::ColourValue mCloudColour;
Ogre::ColourValue mSkyColour;
float mRemainingTransitionTime;
void ModVertexAlpha(Ogre::Entity* ent, unsigned int meshType);
};
}
#endif // _GAME_RENDER_SKY_H