parent
b58b8c6f8f
commit
a18cec7c8e
@ -0,0 +1,111 @@
|
|||||||
|
#include "screenfader.hpp"
|
||||||
|
|
||||||
|
namespace MWGui
|
||||||
|
{
|
||||||
|
|
||||||
|
ScreenFader::ScreenFader()
|
||||||
|
: WindowBase("openmw_screen_fader.layout")
|
||||||
|
, mMode(FadingMode_In)
|
||||||
|
, mRemainingTime(0.f)
|
||||||
|
, mTargetTime(0.f)
|
||||||
|
, mTargetAlpha(0.f)
|
||||||
|
, mCurrentAlpha(0.f)
|
||||||
|
, mStartAlpha(0.f)
|
||||||
|
, mFactor(1.f)
|
||||||
|
{
|
||||||
|
mMainWidget->setSize(MyGUI::RenderManager::getInstance().getViewSize());
|
||||||
|
|
||||||
|
setVisible(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenFader::update(float dt)
|
||||||
|
{
|
||||||
|
if (mRemainingTime > 0)
|
||||||
|
{
|
||||||
|
if (mMode == FadingMode_In)
|
||||||
|
{
|
||||||
|
mCurrentAlpha -= dt/mTargetTime * (mStartAlpha-mTargetAlpha);
|
||||||
|
if (mCurrentAlpha < mTargetAlpha) mCurrentAlpha = mTargetAlpha;
|
||||||
|
}
|
||||||
|
else if (mMode == FadingMode_Out)
|
||||||
|
{
|
||||||
|
mCurrentAlpha += dt/mTargetTime * (mTargetAlpha-mStartAlpha);
|
||||||
|
if (mCurrentAlpha > mTargetAlpha) mCurrentAlpha = mTargetAlpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
mRemainingTime -= dt;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (1.f-((1.f-mCurrentAlpha) * mFactor) == 0.f)
|
||||||
|
mMainWidget->setVisible(false);
|
||||||
|
else
|
||||||
|
applyAlpha();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenFader::applyAlpha()
|
||||||
|
{
|
||||||
|
setVisible(true);
|
||||||
|
mMainWidget->setAlpha(1.f-((1.f-mCurrentAlpha) * mFactor));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenFader::fadeIn(float time)
|
||||||
|
{
|
||||||
|
if (time<0.f) return;
|
||||||
|
if (time==0.f)
|
||||||
|
{
|
||||||
|
mCurrentAlpha = 0.f;
|
||||||
|
applyAlpha();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mStartAlpha = mCurrentAlpha;
|
||||||
|
mTargetAlpha = 0.f;
|
||||||
|
mMode = FadingMode_In;
|
||||||
|
mTargetTime = time;
|
||||||
|
mRemainingTime = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenFader::fadeOut(const float time)
|
||||||
|
{
|
||||||
|
if (time<0.f) return;
|
||||||
|
if (time==0.f)
|
||||||
|
{
|
||||||
|
mCurrentAlpha = 1.f;
|
||||||
|
applyAlpha();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mStartAlpha = mCurrentAlpha;
|
||||||
|
mTargetAlpha = 1.f;
|
||||||
|
mMode = FadingMode_Out;
|
||||||
|
mTargetTime = time;
|
||||||
|
mRemainingTime = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenFader::fadeTo(const int percent, const float time)
|
||||||
|
{
|
||||||
|
if (time<0.f) return;
|
||||||
|
if (time==0.f)
|
||||||
|
{
|
||||||
|
mCurrentAlpha = percent/100.f;
|
||||||
|
applyAlpha();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mStartAlpha = mCurrentAlpha;
|
||||||
|
mTargetAlpha = percent/100.f;
|
||||||
|
|
||||||
|
if (mTargetAlpha == mStartAlpha) return;
|
||||||
|
else if (mTargetAlpha > mStartAlpha) mMode = FadingMode_Out;
|
||||||
|
else mMode = FadingMode_In;
|
||||||
|
|
||||||
|
mTargetTime = time;
|
||||||
|
mRemainingTime = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenFader::setFactor(float factor)
|
||||||
|
{
|
||||||
|
mFactor = factor;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
#include "windowbase.hpp"
|
||||||
|
|
||||||
|
namespace MWGui
|
||||||
|
{
|
||||||
|
|
||||||
|
class ScreenFader : public WindowBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ScreenFader();
|
||||||
|
|
||||||
|
void update(float dt);
|
||||||
|
|
||||||
|
void fadeIn(const float time);
|
||||||
|
void fadeOut(const float time);
|
||||||
|
void fadeTo(const int percent, const float time);
|
||||||
|
|
||||||
|
void setFactor (float factor);
|
||||||
|
|
||||||
|
private:
|
||||||
|
enum FadingMode
|
||||||
|
{
|
||||||
|
FadingMode_In,
|
||||||
|
FadingMode_Out
|
||||||
|
};
|
||||||
|
|
||||||
|
void applyAlpha();
|
||||||
|
|
||||||
|
FadingMode mMode;
|
||||||
|
|
||||||
|
float mRemainingTime;
|
||||||
|
float mTargetTime;
|
||||||
|
float mTargetAlpha;
|
||||||
|
float mCurrentAlpha;
|
||||||
|
float mStartAlpha;
|
||||||
|
|
||||||
|
float mFactor;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<MyGUI type="Layout">
|
||||||
|
<Widget type="ImageBox" skin="ImageBox" layer="Render" position="0 0 300 200" name="_Main" align="Stretch">
|
||||||
|
<Property key="ImageTexture" value="black.png"/>
|
||||||
|
</Widget>
|
||||||
|
</MyGUI>
|
@ -1,136 +0,0 @@
|
|||||||
#include "fader.hpp"
|
|
||||||
|
|
||||||
#include <OgreMaterial.h>
|
|
||||||
#include <OgreTechnique.h>
|
|
||||||
#include <OgreMaterialManager.h>
|
|
||||||
#include <OgreResourceGroupManager.h>
|
|
||||||
#include <OgreRectangle2D.h>
|
|
||||||
#include <OgreSceneManager.h>
|
|
||||||
#include <OgreSceneNode.h>
|
|
||||||
|
|
||||||
|
|
||||||
using namespace Ogre;
|
|
||||||
using namespace OEngine::Render;
|
|
||||||
|
|
||||||
Fader::Fader(Ogre::SceneManager* sceneMgr)
|
|
||||||
: mSceneMgr(sceneMgr)
|
|
||||||
, mMode(FadingMode_In)
|
|
||||||
, mRemainingTime(0.f)
|
|
||||||
, mTargetTime(0.f)
|
|
||||||
, mTargetAlpha(0.f)
|
|
||||||
, mCurrentAlpha(0.f)
|
|
||||||
, mStartAlpha(0.f)
|
|
||||||
, mFactor(1.f)
|
|
||||||
{
|
|
||||||
// Create the fading material
|
|
||||||
MaterialPtr material = MaterialManager::getSingleton().create("FadeInOutMaterial", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME );
|
|
||||||
Pass* pass = material->getTechnique(0)->getPass(0);
|
|
||||||
pass->setSceneBlending(SBT_TRANSPARENT_ALPHA);
|
|
||||||
pass->setDepthWriteEnabled (false);
|
|
||||||
mFadeTextureUnit = pass->createTextureUnitState("black.png");
|
|
||||||
mFadeTextureUnit->setColourOperationEx(LBX_SOURCE1, LBS_MANUAL, LBS_CURRENT, ColourValue(0.f, 0.f, 0.f)); // always black colour
|
|
||||||
|
|
||||||
mRectangle = new Ogre::Rectangle2D(true);
|
|
||||||
mRectangle->setCorners(-1.0, 1.0, 1.0, -1.0);
|
|
||||||
mRectangle->setMaterial("FadeInOutMaterial");
|
|
||||||
mRectangle->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY-1);
|
|
||||||
// Use infinite AAB to always stay visible
|
|
||||||
Ogre::AxisAlignedBox aabInf;
|
|
||||||
aabInf.setInfinite();
|
|
||||||
mRectangle->setBoundingBox(aabInf);
|
|
||||||
// Attach background to the scene
|
|
||||||
Ogre::SceneNode* node = mSceneMgr->getRootSceneNode()->createChildSceneNode();
|
|
||||||
node->attachObject(mRectangle);
|
|
||||||
mRectangle->setVisible(false);
|
|
||||||
mRectangle->setVisibilityFlags (2048);
|
|
||||||
}
|
|
||||||
|
|
||||||
Fader::~Fader()
|
|
||||||
{
|
|
||||||
delete mRectangle;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Fader::update(float dt)
|
|
||||||
{
|
|
||||||
if (mRemainingTime > 0)
|
|
||||||
{
|
|
||||||
if (mMode == FadingMode_In)
|
|
||||||
{
|
|
||||||
mCurrentAlpha -= dt/mTargetTime * (mStartAlpha-mTargetAlpha);
|
|
||||||
if (mCurrentAlpha < mTargetAlpha) mCurrentAlpha = mTargetAlpha;
|
|
||||||
}
|
|
||||||
else if (mMode == FadingMode_Out)
|
|
||||||
{
|
|
||||||
mCurrentAlpha += dt/mTargetTime * (mTargetAlpha-mStartAlpha);
|
|
||||||
if (mCurrentAlpha > mTargetAlpha) mCurrentAlpha = mTargetAlpha;
|
|
||||||
}
|
|
||||||
|
|
||||||
mRemainingTime -= dt;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (1.f-((1.f-mCurrentAlpha) * mFactor) == 0.f)
|
|
||||||
mRectangle->setVisible(false);
|
|
||||||
else
|
|
||||||
applyAlpha();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Fader::applyAlpha()
|
|
||||||
{
|
|
||||||
mRectangle->setVisible(true);
|
|
||||||
mFadeTextureUnit->setAlphaOperation(LBX_SOURCE1, LBS_MANUAL, LBS_CURRENT, 1.f-((1.f-mCurrentAlpha) * mFactor));
|
|
||||||
}
|
|
||||||
|
|
||||||
void Fader::fadeIn(float time)
|
|
||||||
{
|
|
||||||
if (time<0.f) return;
|
|
||||||
if (time==0.f)
|
|
||||||
{
|
|
||||||
mCurrentAlpha = 0.f;
|
|
||||||
applyAlpha();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
mStartAlpha = mCurrentAlpha;
|
|
||||||
mTargetAlpha = 0.f;
|
|
||||||
mMode = FadingMode_In;
|
|
||||||
mTargetTime = time;
|
|
||||||
mRemainingTime = time;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Fader::fadeOut(const float time)
|
|
||||||
{
|
|
||||||
if (time<0.f) return;
|
|
||||||
if (time==0.f)
|
|
||||||
{
|
|
||||||
mCurrentAlpha = 1.f;
|
|
||||||
applyAlpha();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
mStartAlpha = mCurrentAlpha;
|
|
||||||
mTargetAlpha = 1.f;
|
|
||||||
mMode = FadingMode_Out;
|
|
||||||
mTargetTime = time;
|
|
||||||
mRemainingTime = time;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Fader::fadeTo(const int percent, const float time)
|
|
||||||
{
|
|
||||||
if (time<0.f) return;
|
|
||||||
if (time==0.f)
|
|
||||||
{
|
|
||||||
mCurrentAlpha = percent/100.f;
|
|
||||||
applyAlpha();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
mStartAlpha = mCurrentAlpha;
|
|
||||||
mTargetAlpha = percent/100.f;
|
|
||||||
|
|
||||||
if (mTargetAlpha == mStartAlpha) return;
|
|
||||||
else if (mTargetAlpha > mStartAlpha) mMode = FadingMode_Out;
|
|
||||||
else mMode = FadingMode_In;
|
|
||||||
|
|
||||||
mTargetTime = time;
|
|
||||||
mRemainingTime = time;
|
|
||||||
}
|
|
@ -1,59 +0,0 @@
|
|||||||
#ifndef OENGINE_OGRE_FADE_H
|
|
||||||
#define OENGINE_OGRE_FADE_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
A class that handles fading in the screen from black or fading it out to black.
|
|
||||||
|
|
||||||
To achieve this, it uses a full-screen Rectangle2d
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Ogre
|
|
||||||
{
|
|
||||||
class TextureUnitState;
|
|
||||||
class Rectangle2D;
|
|
||||||
class SceneManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace OEngine {
|
|
||||||
namespace Render
|
|
||||||
{
|
|
||||||
class Fader
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Fader(Ogre::SceneManager* sceneMgr);
|
|
||||||
~Fader();
|
|
||||||
|
|
||||||
void update(float dt);
|
|
||||||
|
|
||||||
void fadeIn(const float time);
|
|
||||||
void fadeOut(const float time);
|
|
||||||
void fadeTo(const int percent, const float time);
|
|
||||||
|
|
||||||
void setFactor (float factor) { mFactor = factor; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
enum FadingMode
|
|
||||||
{
|
|
||||||
FadingMode_In,
|
|
||||||
FadingMode_Out
|
|
||||||
};
|
|
||||||
|
|
||||||
void applyAlpha();
|
|
||||||
|
|
||||||
Ogre::TextureUnitState* mFadeTextureUnit;
|
|
||||||
Ogre::Rectangle2D* mRectangle;
|
|
||||||
|
|
||||||
FadingMode mMode;
|
|
||||||
|
|
||||||
float mRemainingTime;
|
|
||||||
float mTargetTime;
|
|
||||||
float mTargetAlpha;
|
|
||||||
float mCurrentAlpha;
|
|
||||||
float mStartAlpha;
|
|
||||||
|
|
||||||
float mFactor;
|
|
||||||
|
|
||||||
Ogre::SceneManager* mSceneMgr;
|
|
||||||
};
|
|
||||||
}}
|
|
||||||
#endif
|
|
Loading…
Reference in New Issue