MovieFrame.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. //============================================================================================
  2. // Spirenkov Maxim, 2006
  3. //============================================================================================
  4. // Mission objects
  5. //============================================================================================
  6. // MovieFrame
  7. //============================================================================================
  8. #include "MovieFrame.h"
  9. //============================================================================================
  10. MovieFrame::MovieFrame()
  11. {
  12. time = 0.0f;
  13. speed = -1.0f;
  14. action = act_hide;
  15. color = Color(0.0f, 0.0f, 0.0f, 0.0f);
  16. varColor = null;
  17. largeshot = null;
  18. }
  19. MovieFrame::~MovieFrame()
  20. {
  21. varColor = NULL;
  22. RELEASE(largeshot);
  23. }
  24. //============================================================================================
  25. //Инициализировать объект
  26. bool MovieFrame::Create(MOPReader & reader)
  27. {
  28. Render().GetShaderId("PostProcessFillScreen_Color", PostProcessFillScreen_Color_id);
  29. if(!varColor)
  30. {
  31. varColor = Render().GetTechniqueGlobalVariable("postProcess_FillScreen_Color", _FL_);
  32. Assert(varColor);
  33. }
  34. if(!largeshot)
  35. {
  36. largeshot = api->Storage().GetItemLong("system.screenshot.Largeshot", _FL_);
  37. }
  38. time = 0.0f;
  39. speed = reader.Float();
  40. if(speed > 1e-3f)
  41. {
  42. speed = 1.0f/speed;
  43. }else{
  44. speed = -1.0f;
  45. }
  46. height = reader.Float()*0.01f;
  47. MissionObject::Activate(false);
  48. action = act_hide;
  49. color = reader.Colors();
  50. color.Clamp();
  51. Show(reader.Bool());
  52. Activate(reader.Bool());
  53. return true;
  54. }
  55. //Пересоздать объект
  56. void MovieFrame::Restart()
  57. {
  58. ReCreate();
  59. }
  60. //Показать/скрыть объект
  61. void MovieFrame::Show(bool isShow)
  62. {
  63. MissionObject::Show(isShow);
  64. if(isShow)
  65. {
  66. if(action != act_hide)
  67. {
  68. Activate(IsActive());
  69. }
  70. LogicDebug("Show");
  71. }else{
  72. DelUpdate();
  73. LogicDebug("Hide");
  74. }
  75. }
  76. //Активировать
  77. void MovieFrame::Activate(bool isActive)
  78. {
  79. MissionObject::Activate(isActive);
  80. if(!EditMode_IsOn())
  81. {
  82. if(IsActive())
  83. {
  84. SetUpdate();
  85. switch(action)
  86. {
  87. case act_activate:
  88. break;
  89. case act_show:
  90. break;
  91. case act_deactivate:
  92. action = act_activate;
  93. break;
  94. case act_hide:
  95. time = 0.0f;
  96. action = act_activate;
  97. break;
  98. }
  99. LogicDebug("Activate");
  100. }else{
  101. switch(action)
  102. {
  103. case act_activate:
  104. action = act_deactivate;
  105. SetUpdate();
  106. break;
  107. case act_show:
  108. time = 1.0f;
  109. action = act_deactivate;
  110. SetUpdate();
  111. break;
  112. case act_deactivate:
  113. SetUpdate();
  114. break;
  115. case act_hide:
  116. break;
  117. }
  118. LogicDebug("Deactivate");
  119. }
  120. }
  121. }
  122. //Инициализировать объект
  123. bool MovieFrame::EditMode_Create(MOPReader & reader)
  124. {
  125. return true;
  126. }
  127. //Обновить параметры
  128. bool MovieFrame::EditMode_Update(MOPReader & reader)
  129. {
  130. return true;
  131. }
  132. //Получить размеры описывающего ящика
  133. void MovieFrame::EditMode_GetSelectBox(Vector & min, Vector & max)
  134. {
  135. min = max = 0.0f;
  136. }
  137. //Рисование
  138. void _cdecl MovieFrame::Draw(float dltTime, long level)
  139. {
  140. if(largeshot)
  141. {
  142. if(largeshot->Get(0))
  143. {
  144. return;
  145. }
  146. }
  147. switch(action)
  148. {
  149. case act_activate:
  150. if(speed > 0.0f)
  151. {
  152. time += speed*dltTime;
  153. if(time >= 1.0f)
  154. {
  155. time = 1.0f;
  156. action = act_show;
  157. }
  158. }else{
  159. time = 1.0f;
  160. action = act_show;
  161. }
  162. break;
  163. case act_show:
  164. break;
  165. case act_deactivate:
  166. if(speed > 0.0f)
  167. {
  168. time -= speed*dltTime;
  169. if(time <= 0.0f)
  170. {
  171. time = 0.0f;
  172. action = act_hide;
  173. DelUpdate();
  174. return;
  175. }
  176. }else{
  177. time = 0.0f;
  178. action = act_hide;
  179. DelUpdate();
  180. return;
  181. }
  182. break;
  183. case act_hide:
  184. DelUpdate();
  185. return;
  186. }
  187. varColor->SetVector4(color.v4);
  188. float h = 2.0f*height*time;
  189. if(h <= 1e-10f)
  190. {
  191. return;
  192. }
  193. //Треугольники
  194. //0,5--------1
  195. //| \ |
  196. //4----------2,3
  197. //
  198. //
  199. //6,11-------7
  200. //| \ |
  201. //10--------8,9
  202. static QuadVertex vrt[12] = {
  203. {Vector4(-1.0f, -1.0f, 0.1f, 1.0f), 0.0f, 0.0f}, //0
  204. {Vector4(1.0f, -1.0f, 0.1f, 1.0f), 0.0f, 0.0f}, //1
  205. {Vector4(1.0f, -1.0f, 0.1f, 1.0f), 0.0f, 0.0f}, //2
  206. {Vector4(1.0f, -1.0f, 0.1f, 1.0f), 0.0f, 0.0f}, //3
  207. {Vector4(-1.0f, -1.0f, 0.1f, 1.0f), 0.0f, 0.0f}, //4
  208. {Vector4(-1.0f, -1.0f, 0.1f, 1.0f), 0.0f, 0.0f}, //5
  209. {Vector4(-1.0f, 1.0f, 0.1f, 1.0f), 0.0f, 0.0f}, //6
  210. {Vector4(1.0f, 1.0f, 0.1f, 1.0f), 0.0f, 0.0f}, //7
  211. {Vector4(1.0f, 1.0f, 0.1f, 1.0f), 0.0f, 0.0f}, //8
  212. {Vector4(1.0f, 1.0f, 0.1f, 1.0f), 0.0f, 0.0f}, //9
  213. {Vector4(-1.0f, 1.0f, 0.1f, 1.0f), 0.0f, 0.0f}, //10
  214. {Vector4(-1.0f, 1.0f, 0.1f, 1.0f), 0.0f, 0.0f} //11
  215. };
  216. //Заполняем высоты
  217. vrt[4].pos.y = vrt[3].pos.y = vrt[2].pos.y = -1.0f + h;
  218. vrt[11].pos.y = vrt[7].pos.y = vrt[6].pos.y = 1.0f - h;
  219. //Рисуем
  220. Render().DrawPrimitiveUP(PostProcessFillScreen_Color_id, PT_TRIANGLELIST, 4, vrt, sizeof(QuadVertex));
  221. }
  222. __forceinline void MovieFrame::SetUpdate()
  223. {
  224. MissionObject::SetUpdate(&MovieFrame::Draw, ML_GUI1 - 1);
  225. }
  226. __forceinline void MovieFrame::DelUpdate()
  227. {
  228. MissionObject::DelUpdate(&MovieFrame::Draw);
  229. }
  230. //============================================================================================
  231. //Параметры инициализации
  232. //============================================================================================
  233. MOP_BEGINLISTCG(MovieFrame, "Movie frame", '1.00', 0x0fffffff, "Black rectangles at top and bottom screen\n show - instant show/hide\nactivate - show slide effect", "Effects")
  234. MOP_FLOATEXC("Slide time", 0.8f, 0.0f, 100.0f, "Slide animation time in seconds")
  235. MOP_FLOATEXC("Height", 10.0f, 0.0f, 100.0f, "Heigh of top or bottom field in percent")
  236. MOP_COLORC("Color", Color(0.0f), "Filling color")
  237. MOP_BOOLC("Show", true, "Show or hide frame")
  238. MOP_BOOLC("Active", false, "Change fileds position open or closed")
  239. MOP_ENDLIST(MovieFrame)