| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- //============================================================================================
- // Spirenkov Maxim, 2006
- //============================================================================================
- // Mission objects
- //============================================================================================
- // Fader
- //============================================================================================
-
- #include "Fader.h"
- //============================================================================================
- Fader::Fader()
- {
- fadeOutTime = 0.5f;
- fadeInTime = 0.5f;
- time = 0.5f;
- action = act_stop;
- color = Color(0.0f, 0.0f, 0.0f, 0.0f);
- texture = null;
- varColor = null;
- varTexture = null;
- }
- Fader::~Fader()
- {
- if(varTexture)
- {
- varTexture->ResetTexture();
- varTexture = null;
- }
- varColor = null;
-
- if(texture)
- {
- texture->Release();
- texture = null;
- }
- }
- //============================================================================================
- //Инициализировать объект
- bool Fader::Create(MOPReader & reader)
- {
- Render().GetShaderId("PostProcessFillScreen_Texture", PostProcessFillScreen_Texture_id);
- Render().GetShaderId("PostProcessFillScreen_Color", PostProcessFillScreen_Color_id);
-
- varColor = Render().GetTechniqueGlobalVariable("postProcess_FillScreen_Color", _FL_);
- Assert(varColor);
- varTexture = Render().GetTechniqueGlobalVariable("postProcess_FillScreen_Texture", _FL_);
- Assert(varTexture);
- time = 0.0f;
- action = act_stop;
- fadeOutTime = reader.Float();
- fadeInTime = reader.Float();
- SetTexture(reader.String().c_str());
- Color c = reader.Colors();
- SetColor(c);
- SetAlpha(c.a);
- start.Init(reader);
- hide.Init(reader);
- stop.Init(reader);
- Activate(reader.Bool());
- return true;
- }
- //Пересоздать объект
- void Fader::Restart()
- {
- ReCreate();
- }
- //Активировать
- void Fader::Activate(bool isActive)
- {
- MissionObject::Activate(isActive);
- if(!EditMode_IsOn())
- {
- if(IsActive())
- {
- SetUpdate(&Fader::Work, ML_ACTIVATE_TRIGGER + 100);
- SetUpdate(&Fader::Draw, ML_GUI5 + 100);
- time = 0.0f;
- if(fadeOutTime > 0.0f)
- {
- SetAlpha(0.0f);
- }else{
- SetAlpha(1.0f);
- }
- action = act_start;
- LogicDebug("Activate");
- }else{
- DelUpdate(&Fader::Work);
- DelUpdate(&Fader::Draw);
- LogicDebug("Deactivate");
- }
- }
- }
- //Инициализировать объект
- bool Fader::EditMode_Create(MOPReader & reader)
- {
- return true;
- }
- //Обновить параметры
- bool Fader::EditMode_Update(MOPReader & reader)
- {
- Activate(false);
- return true;
- }
- //Получить размеры описывающего ящика
- void Fader::EditMode_GetSelectBox(Vector & min, Vector & max)
- {
- min = max = 0.0f;
- }
- //Работа
- void _cdecl Fader::Work(float dltTime, long level)
- {
- dltTime = api->GetDeltaTime();
- switch(action)
- {
- case act_start:
- LogicDebug("Triggering start");
- start.Activate(Mission(), false, this);
- action = act_fadeout;
- case act_fadeout:
- time += dltTime;
- if(time >= fadeOutTime)
- {
- action = act_fadein;
- LogicDebug("Triggering hide");
- hide.Activate(Mission(), false, this);
- time = 0.0f;
- SetAlpha(1.0f);
- }else{
- Assert(fadeOutTime > 0.0f);
- SetAlpha(time/fadeOutTime);
- }
- break;
- case act_fadein:
- if(time >= fadeInTime)
- {
- action = act_stop;
- LogicDebug("Triggering stop");
- stop.Activate(Mission(), false, this);
- time = 0.0f;
- Activate(false);
- }else{
- Assert(fadeInTime > 0.0f);
- SetAlpha(1.0f - time/fadeInTime);
- }
- time += dltTime;
- break;
- }
- }
- //Рисование
- void _cdecl Fader::Draw(float dltTime, long level)
- {
- varColor->SetVector4(color.v4);
- varTexture->SetTexture(texture);
- const RENDERSCREEN & rscr = Render().GetScreenInfo2D();
- if(texture)
- {
- Render().DrawFullScreenQuad((float)rscr.dwWidth, (float)rscr.dwHeight, PostProcessFillScreen_Texture_id);
- }else{
- Render().DrawFullScreenQuad((float)rscr.dwWidth, (float)rscr.dwHeight, PostProcessFillScreen_Color_id);
- }
- }
- void Fader::SetTexture(const char * fileName)
- {
- if(texture)
- {
- texture->Release();
- }
- if(fileName && fileName[0])
- {
- texture = Render().CreateTexture(_FL_, fileName);
- }else{
- texture = Render().getWhiteTexture();
- texture->AddRef();
- }
- varTexture->SetTexture(texture);
- }
- void Fader::SetColor(const Color & c)
- {
- color = c;
- color.Clamp();
- }
- void Fader::SetAlpha(float alpha)
- {
- color.a = Clampf(alpha);
- }
- //============================================================================================
- //Параметры инициализации
- //============================================================================================
- MOP_BEGINLISTCG(Fader, "Fader", '1.00', 0x0fffffff, "Fader in/out", "Effects")
- MOP_FLOATEXC("Fade out", 1.2f, 0.0f, 1000.0f, "Fade out time in seconds")
- MOP_FLOATEXC("Fade in", 1.2f, 0.0f, 1000.0f, "Fade in time in seconds")
- MOP_STRINGC("Image", "", "Texture image for filling screen")
- MOP_COLORC("Color", Color(0.0f), "Filling color if dont set image")
- MOP_GROUPBEGC("Start", "Triggering when fader start")
- MOP_MISSIONTRIGGER("Start.")
- MOP_GROUPEND()
- MOP_GROUPBEGC("Hide", "Triggering when fader hide screen work")
- MOP_MISSIONTRIGGER("Hide.")
- MOP_GROUPEND()
- MOP_GROUPBEGC("End", "Triggering when fader end work")
- MOP_MISSIONTRIGGER("End.")
- MOP_GROUPEND()
- MOP_BOOL("Active", false)
- MOP_ENDLIST(Fader)
|