Fader.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. //============================================================================================
  2. // Spirenkov Maxim, 2006
  3. //============================================================================================
  4. // Mission objects
  5. //============================================================================================
  6. // Fader
  7. //============================================================================================
  8. #include "Fader.h"
  9. //============================================================================================
  10. Fader::Fader()
  11. {
  12. fadeOutTime = 0.5f;
  13. fadeInTime = 0.5f;
  14. time = 0.5f;
  15. action = act_stop;
  16. color = Color(0.0f, 0.0f, 0.0f, 0.0f);
  17. texture = null;
  18. varColor = null;
  19. varTexture = null;
  20. }
  21. Fader::~Fader()
  22. {
  23. if(varTexture)
  24. {
  25. varTexture->ResetTexture();
  26. varTexture = null;
  27. }
  28. varColor = null;
  29. if(texture)
  30. {
  31. texture->Release();
  32. texture = null;
  33. }
  34. }
  35. //============================================================================================
  36. //Инициализировать объект
  37. bool Fader::Create(MOPReader & reader)
  38. {
  39. Render().GetShaderId("PostProcessFillScreen_Texture", PostProcessFillScreen_Texture_id);
  40. Render().GetShaderId("PostProcessFillScreen_Color", PostProcessFillScreen_Color_id);
  41. varColor = Render().GetTechniqueGlobalVariable("postProcess_FillScreen_Color", _FL_);
  42. Assert(varColor);
  43. varTexture = Render().GetTechniqueGlobalVariable("postProcess_FillScreen_Texture", _FL_);
  44. Assert(varTexture);
  45. time = 0.0f;
  46. action = act_stop;
  47. fadeOutTime = reader.Float();
  48. fadeInTime = reader.Float();
  49. SetTexture(reader.String().c_str());
  50. Color c = reader.Colors();
  51. SetColor(c);
  52. SetAlpha(c.a);
  53. start.Init(reader);
  54. hide.Init(reader);
  55. stop.Init(reader);
  56. Activate(reader.Bool());
  57. return true;
  58. }
  59. //Пересоздать объект
  60. void Fader::Restart()
  61. {
  62. ReCreate();
  63. }
  64. //Активировать
  65. void Fader::Activate(bool isActive)
  66. {
  67. MissionObject::Activate(isActive);
  68. if(!EditMode_IsOn())
  69. {
  70. if(IsActive())
  71. {
  72. SetUpdate(&Fader::Work, ML_ACTIVATE_TRIGGER + 100);
  73. SetUpdate(&Fader::Draw, ML_GUI5 + 100);
  74. time = 0.0f;
  75. if(fadeOutTime > 0.0f)
  76. {
  77. SetAlpha(0.0f);
  78. }else{
  79. SetAlpha(1.0f);
  80. }
  81. action = act_start;
  82. LogicDebug("Activate");
  83. }else{
  84. DelUpdate(&Fader::Work);
  85. DelUpdate(&Fader::Draw);
  86. LogicDebug("Deactivate");
  87. }
  88. }
  89. }
  90. //Инициализировать объект
  91. bool Fader::EditMode_Create(MOPReader & reader)
  92. {
  93. return true;
  94. }
  95. //Обновить параметры
  96. bool Fader::EditMode_Update(MOPReader & reader)
  97. {
  98. Activate(false);
  99. return true;
  100. }
  101. //Получить размеры описывающего ящика
  102. void Fader::EditMode_GetSelectBox(Vector & min, Vector & max)
  103. {
  104. min = max = 0.0f;
  105. }
  106. //Работа
  107. void _cdecl Fader::Work(float dltTime, long level)
  108. {
  109. dltTime = api->GetDeltaTime();
  110. switch(action)
  111. {
  112. case act_start:
  113. LogicDebug("Triggering start");
  114. start.Activate(Mission(), false, this);
  115. action = act_fadeout;
  116. case act_fadeout:
  117. time += dltTime;
  118. if(time >= fadeOutTime)
  119. {
  120. action = act_fadein;
  121. LogicDebug("Triggering hide");
  122. hide.Activate(Mission(), false, this);
  123. time = 0.0f;
  124. SetAlpha(1.0f);
  125. }else{
  126. Assert(fadeOutTime > 0.0f);
  127. SetAlpha(time/fadeOutTime);
  128. }
  129. break;
  130. case act_fadein:
  131. if(time >= fadeInTime)
  132. {
  133. action = act_stop;
  134. LogicDebug("Triggering stop");
  135. stop.Activate(Mission(), false, this);
  136. time = 0.0f;
  137. Activate(false);
  138. }else{
  139. Assert(fadeInTime > 0.0f);
  140. SetAlpha(1.0f - time/fadeInTime);
  141. }
  142. time += dltTime;
  143. break;
  144. }
  145. }
  146. //Рисование
  147. void _cdecl Fader::Draw(float dltTime, long level)
  148. {
  149. varColor->SetVector4(color.v4);
  150. varTexture->SetTexture(texture);
  151. const RENDERSCREEN & rscr = Render().GetScreenInfo2D();
  152. if(texture)
  153. {
  154. Render().DrawFullScreenQuad((float)rscr.dwWidth, (float)rscr.dwHeight, PostProcessFillScreen_Texture_id);
  155. }else{
  156. Render().DrawFullScreenQuad((float)rscr.dwWidth, (float)rscr.dwHeight, PostProcessFillScreen_Color_id);
  157. }
  158. }
  159. void Fader::SetTexture(const char * fileName)
  160. {
  161. if(texture)
  162. {
  163. texture->Release();
  164. }
  165. if(fileName && fileName[0])
  166. {
  167. texture = Render().CreateTexture(_FL_, fileName);
  168. }else{
  169. texture = Render().getWhiteTexture();
  170. texture->AddRef();
  171. }
  172. varTexture->SetTexture(texture);
  173. }
  174. void Fader::SetColor(const Color & c)
  175. {
  176. color = c;
  177. color.Clamp();
  178. }
  179. void Fader::SetAlpha(float alpha)
  180. {
  181. color.a = Clampf(alpha);
  182. }
  183. //============================================================================================
  184. //Параметры инициализации
  185. //============================================================================================
  186. MOP_BEGINLISTCG(Fader, "Fader", '1.00', 0x0fffffff, "Fader in/out", "Effects")
  187. MOP_FLOATEXC("Fade out", 1.2f, 0.0f, 1000.0f, "Fade out time in seconds")
  188. MOP_FLOATEXC("Fade in", 1.2f, 0.0f, 1000.0f, "Fade in time in seconds")
  189. MOP_STRINGC("Image", "", "Texture image for filling screen")
  190. MOP_COLORC("Color", Color(0.0f), "Filling color if dont set image")
  191. MOP_GROUPBEGC("Start", "Triggering when fader start")
  192. MOP_MISSIONTRIGGER("Start.")
  193. MOP_GROUPEND()
  194. MOP_GROUPBEGC("Hide", "Triggering when fader hide screen work")
  195. MOP_MISSIONTRIGGER("Hide.")
  196. MOP_GROUPEND()
  197. MOP_GROUPBEGC("End", "Triggering when fader end work")
  198. MOP_MISSIONTRIGGER("End.")
  199. MOP_GROUPEND()
  200. MOP_BOOL("Active", false)
  201. MOP_ENDLIST(Fader)