TaskPointer.cpp 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. #include "TaskPointer.h"
  2. //Вершины для рендера картинок
  3. Vector4 TaskPointer::vertices[4];
  4. TaskPointer::TaskPointer()
  5. {
  6. back = null;
  7. mask = null;
  8. texVar = null;
  9. scene = null;
  10. modelPos = fov = w = h = 0.0f;
  11. vertices[0] = Vector4(0.0f, 0.0f, 0.0f, 1.0f);
  12. vertices[1] = Vector4(1.0f, 0.0f, 0.0f, 1.0f);
  13. vertices[2] = Vector4(0.0f, 1.0f, 0.0f, 1.0f);
  14. vertices[3] = Vector4(1.0f, 1.0f, 0.0f, 1.0f);
  15. observer.Reset();
  16. target .Reset();
  17. showPosition = 0.0f;
  18. }
  19. TaskPointer::~TaskPointer()
  20. {
  21. if(texVar)
  22. {
  23. texVar->SetTexture(null);
  24. texVar = null;
  25. }
  26. RELEASE(back);
  27. RELEASE(mask);
  28. RELEASE(scene);
  29. }
  30. //Инициализировать объект
  31. bool TaskPointer::Create(MOPReader & reader)
  32. {
  33. Render().GetShaderId("Interface_TaskpointerPicture", Interface_TaskpointerPicture_id);
  34. Render().GetShaderId("Interface_TaskpointerPictureMask", Interface_TaskpointerPictureMask_id);
  35. if(!texVar)
  36. {
  37. texVar = Render().GetTechniqueGlobalVariable("TaskPointer_Texture", _FL_);
  38. }
  39. RELEASE(back);
  40. RELEASE(mask);
  41. RELEASE(scene);
  42. observer.Reset();
  43. target .Reset();
  44. showPosition = 1.0f;
  45. current.SetIdentity();
  46. string s = reader.String().c_str();
  47. if(!s.IsEmpty())
  48. {
  49. // back = Render().CreateTexture(_FL_, s);
  50. back = Render().CreateTextureFullQuality(_FL_, s);
  51. }
  52. s = reader.String().c_str();
  53. if(!s.IsEmpty())
  54. {
  55. // mask = Render().CreateTexture(_FL_, s);
  56. mask = Render().CreateTextureFullQuality(_FL_, s);
  57. }
  58. s = reader.String().c_str();
  59. if(!s.IsEmpty())
  60. {
  61. scene = Geometry().CreateGMX(s.GetBuffer(), &Animation(), &Particles(), &Sound());
  62. if(scene)
  63. {
  64. scene->SetDynamicLightState(false);
  65. }
  66. }
  67. w = reader.Float();
  68. h = reader.Float();
  69. fov = reader.Float()*PI/180.0f;
  70. camera.Build(reader.Angles());
  71. modelPos = reader.Position();
  72. modelRot = Matrix(reader.Angles());
  73. modelRot.pos = reader.Position();
  74. float scale = reader.Float();
  75. modelRot.Scale(scale);
  76. observerId = reader.String().c_str();
  77. targetId = reader.String().c_str();
  78. showPosition = 0.0f;
  79. drawPriority = reader.Long();
  80. Show(reader.Bool());
  81. Activate(reader.Bool());
  82. return true;
  83. }
  84. //Инициализировать объект
  85. bool TaskPointer::EditMode_Create(MOPReader & reader)
  86. {
  87. Create(reader);
  88. return true;
  89. }
  90. //Обновить параметры
  91. bool TaskPointer::EditMode_Update(MOPReader & reader)
  92. {
  93. Create(reader);
  94. return true;
  95. }
  96. //Обработчик команд для объекта
  97. void TaskPointer::Command(const char * id, dword numParams, const char ** params)
  98. {
  99. if( numParams < 1 )
  100. return;
  101. if( string::IsEmpty(id))
  102. return;
  103. if( string::IsEqual(id,"Observer"))
  104. {
  105. observerId = params[0];
  106. observer.Reset();
  107. }
  108. else
  109. if( string::IsEqual(id,"Target"))
  110. {
  111. targetId = params[0];
  112. target.Reset();
  113. }
  114. }
  115. //Показать/скрыть объект
  116. void TaskPointer::Show(bool isShow)
  117. {
  118. if(EditMode_IsOn())
  119. {
  120. if(EditMode_IsSelect())
  121. {
  122. isShow = true;
  123. }
  124. }
  125. MissionObject::Show(isShow);
  126. if(isShow)
  127. {
  128. LogicDebug("Show");
  129. Activate(IsActive());
  130. }else{
  131. showPosition = 0.0f;
  132. LogicDebug("Hide");
  133. DelUpdate(&TaskPointer::Draw);
  134. }
  135. }
  136. //Активировать
  137. void TaskPointer::Activate(bool isActive)
  138. {
  139. if(EditMode_IsOn())
  140. {
  141. if(EditMode_IsSelect())
  142. {
  143. isActive = true;
  144. }
  145. }
  146. bool isChange = isActive != IsActive();
  147. MissionObject::Activate(isActive);
  148. if(!IsShow())
  149. {
  150. LogicDebug("Save active state, but not applyed, becose element not visible");
  151. return;
  152. }
  153. if(isActive)
  154. {
  155. if(back || scene || mask)
  156. {
  157. SetUpdate(&TaskPointer::Draw, ML_GUI4 + drawPriority);
  158. }
  159. }
  160. }
  161. #ifndef MIS_STOP_EDIT_FUNCS
  162. //Выделить объект
  163. void TaskPointer::EditMode_Select(bool isSelect)
  164. {
  165. MissionObject::EditMode_Select(isSelect);
  166. Show(IsShow());
  167. Activate(IsActive());
  168. }
  169. #endif
  170. //Нарисовать модельку
  171. void _cdecl TaskPointer::Draw(float dltTime, long level)
  172. {
  173. if(InterfaceUtils::IsHide()) return;
  174. //Анализируем смещение
  175. const float moveSpeed = 2.0f;
  176. if(IsActive())
  177. {
  178. showPosition += dltTime*moveSpeed;
  179. if(showPosition > 1.0f)
  180. {
  181. showPosition = 1.0f;
  182. }
  183. }else{
  184. showPosition -= dltTime*moveSpeed;
  185. if(showPosition <= 0.0f)
  186. {
  187. showPosition = 0.0f;
  188. if(!EditMode_IsOn())
  189. {
  190. DelUpdate(&TaskPointer::Draw);
  191. }
  192. return;
  193. }
  194. }
  195. if(EditMode_IsOn())
  196. {
  197. if(!EditMode_IsSelect()) return;
  198. showPosition = 1.0f;
  199. }
  200. //Сохраняем текущие параметры
  201. RENDERVIEWPORT savedVP = Render().GetViewport();
  202. Matrix savedView = Render().GetView();
  203. Matrix savedPrj = Render().GetProjection();
  204. //Новый вьюпорт
  205. // dword width = Render().GetScreenInfo().dwWidth;
  206. // dword height = Render().GetScreenInfo().dwHeight;
  207. const RENDERVIEWPORT &nat = Render().GetViewport();
  208. dword width = nat.Width;
  209. dword height = nat.Height;
  210. RENDERVIEWPORT vp;
  211. vp.Width = dword(w*width);
  212. vp.Height = dword(h*height*InterfaceUtils::AspectRatio(Render()));
  213. vp.X = nat.X + width - vp.Width - 1 - InterfaceUtils::HideFieldSize(Render());
  214. vp.Y = nat.Y + height - vp.Height - 1 - InterfaceUtils::HideFieldSize(Render());
  215. if(vp.Width < 16) vp.Width = 16;
  216. if(vp.Width > width) vp.Width = width;
  217. if(vp.Height < 16) vp.Height = 16;
  218. if(vp.Height > height) vp.Height = height;
  219. vp.MinZ = 0.0f;
  220. vp.MaxZ = 1.0f;
  221. Render().SetViewport(vp);
  222. //Матрица проекции
  223. Matrix prj;
  224. prj.BuildProjection(fov, (float)vp.Width, (float)vp.Height, 0.01f, 10.0f);
  225. prj.vz.x = modelPos.x - (showPosition - 1.0f)*2.0f;
  226. prj.vz.y = modelPos.y;
  227. Render().SetProjection(prj);
  228. //Матрица камеры
  229. Matrix view;
  230. view.BuildView(Vector(0.0f, 0.0f, -modelPos.z), Vector(0.0f), Vector(0.0f, 1.0f, 0.0f));
  231. Render().SetView(view);
  232. //Рисуем элементы
  233. if(back)
  234. {
  235. vertices[0].z = showPosition;
  236. vertices[1].z = showPosition;
  237. vertices[2].z = showPosition;
  238. vertices[3].z = showPosition;
  239. texVar->SetTexture(back);
  240. Render().DrawPrimitiveUP(Interface_TaskpointerPicture_id, PT_TRIANGLESTRIP, 2, vertices, sizeof(vertices[0]));
  241. }
  242. if(scene)
  243. {
  244. Matrix orient;
  245. if(!EditMode_IsOn())
  246. {
  247. if(UpdatePointer(observerId, observer))
  248. {
  249. if(UpdatePointer(targetId, target))
  250. {
  251. Vector from = observer.Ptr()->GetMatrix(Matrix()).pos;
  252. Vector to = target.Ptr()->GetMatrix(Matrix()).pos;
  253. Vector dir = (savedView.MulNormal(to - from)).GetXZ();
  254. if(dir.NormalizeXZ() > 1e-10f)
  255. {
  256. orient.vy = Vector(0.0f, 1.0f, 0.0f);
  257. orient.vz = dir;
  258. orient.vx = orient.vy ^ orient.vz;
  259. float kBlend = Clampf(dltTime*10.0f);
  260. current.SLerp(current, Quaternion(orient), kBlend);
  261. }
  262. }
  263. }
  264. }else{
  265. orient.Build(0.0f, dltTime, 0.0f);
  266. current = current*Quaternion(orient);
  267. }
  268. current.GetMatrix(orient);
  269. RENDERRECT rect;
  270. rect.x1 = vp.X;
  271. rect.y1 = vp.Y;
  272. rect.x2 = vp.X + vp.Width - 1;
  273. rect.y2 = vp.Y + vp.Height - 1;
  274. Render().Clear(1, &rect, CLEAR_ZBUFFER, 0, 1.0f, 0);
  275. if(mask)
  276. {
  277. vertices[0].z = showPosition;
  278. vertices[1].z = showPosition;
  279. vertices[2].z = showPosition;
  280. vertices[3].z = showPosition;
  281. texVar->SetTexture(mask);
  282. Render().DrawPrimitiveUP(Interface_TaskpointerPictureMask_id, PT_TRIANGLESTRIP, 2, vertices, sizeof(vertices[0]));
  283. }
  284. //Geometry().SetRenderMode("GMX_SingleTextureWOSh");
  285. scene->SetTransform(modelRot*orient*camera);
  286. scene->Draw();
  287. //Geometry().SetRenderMode();
  288. }
  289. //Востанавливаем параметры
  290. Render().SetViewport(savedVP);
  291. Render().SetView(savedView);
  292. Render().SetProjection(savedPrj);
  293. }
  294. //Обновить указатель на объект
  295. bool TaskPointer::UpdatePointer(const string &str, MOSafePointer &ptr)
  296. {
  297. if( ptr.Validate())
  298. {
  299. return true;
  300. }
  301. else
  302. {
  303. return FindObject(ConstString(str),ptr);
  304. }
  305. }
  306. const char * TaskPointer::comment =
  307. "UI element for show task place direction.\n"
  308. "Commands:\n"
  309. " Observer [new observer id]\n"
  310. " Target [new target id]\n"
  311. " ";
  312. MOP_BEGINLISTCG(TaskPointer, "Task pointer", '1.00', 100000000, TaskPointer::comment, "Interface")
  313. MOP_STRING("Background", "")
  314. MOP_STRING("Model mask", "")
  315. MOP_STRING("Model", "")
  316. MOP_FLOATEX("Width", 0.125f, 0.0f,1.0f)
  317. MOP_FLOATEX("Height", 0.125f, 0.0f,1.0f)
  318. MOP_FLOATEX("FOV", 30.0f, 0.0f, 140.0f)
  319. MOP_ANGLES("Camera angle", 0.0f)
  320. MOP_POSITIONEX("Model position", Vector(0.0f, 0.0f, 1.0f), Vector(-2.0f, -2.0f, 0.0f), Vector(2.0f, 2.0f, 1000.0f))
  321. MOP_ANGLES("Model angle", 0.0f)
  322. MOP_POSITION("Model offset", 0.0f)
  323. MOP_FLOATEX("Model scale", 1.0f, 0.0001f, 10000.0f)
  324. MOP_STRING("Observer", "Player")
  325. MOP_STRING("Target", "")
  326. MOP_LONG("Draw priority", 0)
  327. MOP_BOOLC("Show", true, "Show or hide instantly")
  328. MOP_BOOLC("Active", true, "Show or hide with animation")
  329. MOP_ENDLIST(TaskPointer)