movecontroller.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646
  1. #include "missioneditor.h"
  2. #include "movecontroller.h"
  3. #include "forms\mainwindow.h"
  4. #include "forms\panel.h"
  5. #include "attributes\AttributeList.h"
  6. #define OFFSET_FROM_ZERO 0.0f
  7. #define AXIS_SIZE 1.00f
  8. #define OFFSET_TO_PRINT 1.25f
  9. #define OFFSET_ADD 0.35f
  10. extern TMainWindow* MainWindow;
  11. extern BaseAttribute* pEditableNode;
  12. extern Matrix ViewPortProjectionMatrix;
  13. MoveController::MoveController ()
  14. {
  15. bStickyMove = false;
  16. AxisScale = 1.0f;
  17. newCursorPos = Vector (0.0f);
  18. sNormal = Vector (0.0f);
  19. v1 = Vector (0.0f);
  20. v2 = Vector (0.0f);
  21. bPressed = false;
  22. Mode = DISABLE;
  23. Active = false;
  24. Mode = 0;
  25. pRS = (IRender*)api->GetService("DX9Render");
  26. p3DFont = pRS->CreateFont("Arial", 18.0f, 0xFFFFFF, "EditorFont");
  27. query = pRS->CreateOcclusionQuery(_FL_);
  28. }
  29. MoveController::~MoveController ()
  30. {
  31. if (query)
  32. {
  33. query->Release();
  34. }
  35. if (p3DFont) p3DFont->Release();
  36. }
  37. void MoveController::Activate (bool Active)
  38. {
  39. this->Active = Active;
  40. }
  41. MissionEditor::tCreatedMO* MoveController::GetSelectedObject ()
  42. {
  43. GUITreeNode* sNode = MainWindow->TreeView1->GetSelectedNode ();
  44. if (sNode == NULL) return NULL;
  45. if (sNode->bReadOnly) return NULL;
  46. if (sNode->Tag == TAG_ATTRIBUTE)
  47. {
  48. BaseAttribute* pBaseNode = (BaseAttribute*)sNode->Data;
  49. MissionEditor::tCreatedMO* curNode = (MissionEditor::tCreatedMO*)pBaseNode->GetMasterData ();
  50. return curNode;
  51. }
  52. if (sNode->Tag != TAG_OBJECT) return NULL;
  53. MissionEditor::tCreatedMO* pMo = (MissionEditor::tCreatedMO*)sNode->Data;
  54. if (!pMo->pObject.Validate()) return NULL;
  55. return pMo;
  56. }
  57. PositionAttribute* MoveController::GetFirstPO_FromSelectedObject ()
  58. {
  59. GUITreeNode* sNode = MainWindow->TreeView1->GetSelectedNode ();
  60. if (sNode == NULL) return NULL;
  61. if (sNode->bReadOnly) return NULL;
  62. if (sNode->Tag == TAG_ATTRIBUTE)
  63. {
  64. BaseAttribute* pBaseNode = (BaseAttribute*)sNode->Data;
  65. if (pBaseNode->GetType() != IMOParams::t_position) return NULL;
  66. PositionAttribute* pos = (PositionAttribute*)pBaseNode;
  67. return pos;
  68. }
  69. if (sNode->Tag != TAG_OBJECT) return NULL;
  70. MissionEditor::tCreatedMO* pMo = (MissionEditor::tCreatedMO*)sNode->Data;
  71. if (!pMo->pObject.Validate()) return NULL;
  72. PositionAttribute* finded_attr = NULL;
  73. for (int n =0; n < pMo->AttrList->GetCount(); n++)
  74. {
  75. BaseAttribute* bAttr = pMo->AttrList->Get(n);
  76. if (bAttr->GetType() == IMOParams::t_position)
  77. {
  78. finded_attr = (PositionAttribute*)bAttr;
  79. return finded_attr;
  80. }
  81. }
  82. return NULL;
  83. }
  84. void MoveController::Draw ()
  85. {
  86. if (!Active) return;
  87. PositionAttribute* f_attr = GetFirstPO_FromSelectedObject ();
  88. if (f_attr == NULL) return;
  89. Vector cPos;
  90. cPos = f_attr->GetValue();
  91. bStickyUpOffset = false;
  92. if (GetAsyncKeyState(VK_SHIFT) < 0)
  93. {
  94. if (GetAsyncKeyState(VK_CONTROL) < 0)
  95. {
  96. bStickyUpOffset = true;
  97. }
  98. if (bStickyUpOffset)
  99. {
  100. pRS->DrawXZCircle(cPos - Vector(0.0f, -0.25f, 0.0f), 1.0f, 0xFFFFFF00);
  101. pRS->DrawXZCircle(cPos - Vector(0.0f, -0.5f, 0.0f), 1.0f, 0xFFFFFF00);
  102. }
  103. pRS->DrawXZCircle(cPos, 1.0f, 0xFFFFFF00);
  104. bStickyMove = true;
  105. return;
  106. }
  107. bStickyMove = false;
  108. if (!bPressed)
  109. {
  110. Vector tobject_pos = cPos * pRS->GetView();
  111. float fDistance = tobject_pos.z;
  112. // float fDistance = sqrtf(~(cPos - .GetCamPos()));
  113. AxisScale = fDistance / 10.0f;
  114. if (AxisScale < 1.0f) AxisScale = 1.0f;
  115. }
  116. /*
  117. Matrix matObj;
  118. pMo->pObject->GetMatrix(matObj);
  119. Vector cPos = matObj.pos;
  120. */
  121. pRS->SetWorld (Matrix());
  122. //X
  123. DWORD color = 0xFFFF0000;
  124. if (Mode == X_AXIS) color = 0xFFFFFF00;
  125. pRS->DrawVector (cPos + Vector (OFFSET_FROM_ZERO, 0.0f, 0.0f), cPos + Vector (AXIS_SIZE*AxisScale, 0.0f, 0.0f), color, "EditorLineNoZ");
  126. p3DFont->SetColor (color);
  127. p3DFont->Print (cPos + Vector (OFFSET_TO_PRINT*AxisScale, 0.0f, 0.0f), 1000.0f, 0.0f, "X");
  128. //Y
  129. color = 0xFF00FF00;
  130. if (Mode == Y_AXIS) color = 0xFFFFFF00;
  131. pRS->DrawVector (cPos + Vector (0.0f, OFFSET_FROM_ZERO, 0.0f), cPos + Vector (0.0f, AXIS_SIZE*AxisScale, 0.0f), color, "EditorLineNoZ");
  132. p3DFont->SetColor (color);
  133. p3DFont->Print (cPos + Vector (0.0f, OFFSET_TO_PRINT*AxisScale, 0.0f), 1000.0f, 0.0f, "Y");
  134. //Z
  135. color = 0xFF0000FF;
  136. if (Mode == Z_AXIS) color = 0xFFFFFF00;
  137. pRS->DrawVector (cPos + Vector (0.0f, 0.0f, OFFSET_FROM_ZERO), cPos + Vector (0.0f, 0.0f, AXIS_SIZE*AxisScale), color, "EditorLineNoZ");
  138. p3DFont->SetColor (color);
  139. p3DFont->Print (cPos + Vector (0.0f, 0.0f, OFFSET_TO_PRINT*AxisScale), 1000.0f, 0.0f, "Z");
  140. /*
  141. // additional draw...
  142. // BLUE
  143. color = 0xFF0000FF;
  144. pRS->DrawLine (cPos + Vector (0.0f, 0.0f, OFFSET_ADD), color, cPos + Vector (OFFSET_ADD, 0.0f, OFFSET_ADD), color, false, "EditorLineNoZ");
  145. pRS->DrawLine (cPos + Vector (0.0f, 0.0f, OFFSET_ADD), color, cPos + Vector (0.0f, OFFSET_ADD, OFFSET_ADD), color, false, "EditorLineNoZ");
  146. // GREEN
  147. color = 0xFF00FF00;
  148. pRS->DrawLine (cPos + Vector (0.0f, OFFSET_ADD, 0.0f), color, cPos + Vector (0.0f, OFFSET_ADD, OFFSET_ADD), color, false, "EditorLineNoZ");
  149. pRS->DrawLine (cPos + Vector (0.0f, OFFSET_ADD, 0.0f), color, cPos + Vector (OFFSET_ADD, OFFSET_ADD, 0.0f), color, false, "EditorLineNoZ");
  150. // RED
  151. color = 0xFFFF0000;
  152. pRS->DrawLine (cPos + Vector (OFFSET_ADD, 0.0f, 0.0f), color, cPos + Vector (OFFSET_ADD, 0.0f, OFFSET_ADD), color, false, "EditorLineNoZ");
  153. pRS->DrawLine (cPos + Vector (OFFSET_ADD, 0.0f, 0.0f), color, cPos + Vector (OFFSET_ADD, OFFSET_ADD, 0.0f), color, false, "EditorLineNoZ");
  154. */
  155. AxisX = Line(cPos + Vector (0.0f, 0.0f, 0.0f), cPos + Vector (AXIS_SIZE*AxisScale, 0.0f, 0.0f));
  156. AxisY = Line(cPos + Vector (0.0f, 0.0f, 0.0f), cPos + Vector (0.0f, AXIS_SIZE*AxisScale, 0.0f));
  157. AxisZ = Line(cPos + Vector (0.0f, 0.0f, 0.0f), cPos + Vector (0.0f, 0.0f, AXIS_SIZE*AxisScale));
  158. //pRS->Print(v1.x, v1.y, 0xFFFFFFFF, "X");
  159. //pRS->Print(v2.x, v2.y, 0xFFFFFFFF, "X");
  160. //pRS->Print(newCursorPos.x, newCursorPos.y, 0xFFFFFFFF, "O");
  161. }
  162. void MoveController::ExtractRay (const RENDERVIEWPORT& viewport, const GUIPoint &ptCursor, Vector& raystart, Vector& rayend)
  163. {
  164. Matrix matProj = ViewPortProjectionMatrix;;
  165. Vector v;
  166. v.x = ( ( ( 2.0f * ptCursor.x ) / viewport.Width ) - 1 ) / matProj.m[0][0];
  167. v.y = -( ( ( 2.0f * ptCursor.y ) / viewport.Height ) - 1 ) / matProj.m[1][1];
  168. v.z = 1.0f;
  169. Matrix mView = pRS->GetView();
  170. mView.Inverse ();
  171. Vector raydir;
  172. Vector rayorig;
  173. raydir = mView.MulNormal(v);
  174. rayorig = mView.pos;
  175. raystart = rayorig;
  176. rayend = (rayorig + (raydir * 100.f));
  177. }
  178. struct RecVertex
  179. {
  180. Vector p;
  181. unsigned long color;
  182. };
  183. void MoveController::ScreenToD3D (int sX, int sY, float &d3dX, float &d3dY)
  184. {
  185. float fScrX = float(pRS->GetScreenInfo3D().dwWidth) / 2.0f;
  186. float fScrY = float(pRS->GetScreenInfo3D().dwHeight) / 2.0f;
  187. d3dX = (float)sX / fScrX - 1.0f;
  188. d3dY = -((float)sY / fScrY - 1.0f);
  189. }
  190. void MoveController::DrawOccluder (int pX, int pY, int width, int height, float depth, unsigned long color)
  191. {
  192. RecVertex vrx[6];
  193. Vector From = Vector (0.0f);
  194. Vector To = Vector (0.0f);
  195. ScreenToD3D (pX, pY, From.x, From.y);
  196. ScreenToD3D ((pX+width), (pY+height), To.x, To.y);
  197. vrx[0].p = From;
  198. vrx[1].p = Vector (To.x, From.y, 1.0f);
  199. vrx[2].p = To;
  200. vrx[3].p = To;
  201. vrx[4].p = Vector (From.x, To.y, 1.0f);
  202. vrx[5].p = From;
  203. for (int r = 0; r < 6; r++)
  204. {
  205. vrx[r].color = color;
  206. vrx[r].p.z = depth;
  207. }
  208. ShaderId occRectID;
  209. pRS->GetShaderId("OccluderRec", occRectID);
  210. pRS->DrawPrimitiveUP (occRectID, PT_TRIANGLELIST, 2, vrx, sizeof (RecVertex));
  211. }
  212. float MoveController::GetDepth_BinarySearch(const GUIPoint & pt, float fMin, float fMax, int depth)
  213. {
  214. float fDepthCenter = fMin + ((fMax - fMin) * 0.5f);
  215. if (depth > 24)
  216. {
  217. return fDepthCenter;
  218. }
  219. query->Begin();
  220. DrawOccluder (pt.x, pt.y, 1, 1, fDepthCenter, 0xFFFFFFFF);
  221. query->End();
  222. DWORD dwPixels = query->GetResult();
  223. if (dwPixels > 0)
  224. {
  225. //точка ближе чем нужно
  226. fMin = fDepthCenter;
  227. fMax = fMax;
  228. } else
  229. {
  230. //точка дальше чем нужно
  231. fMin = fMin;
  232. fMax = fDepthCenter;
  233. }
  234. float foundedDepth = GetDepth_BinarySearch(pt, fMin, fMax, depth+1);
  235. return foundedDepth;
  236. }
  237. Vector MoveController::GetWorldPositionUnderMouse(const GUIPoint &ptCursor, const RENDERVIEWPORT& viewport, double &distToCamera)
  238. {
  239. RENDERVIEWPORT oldVP = pRS->GetViewport();
  240. RENDERVIEWPORT newVP = pRS->GetFullScreenViewPort_2D();
  241. pRS->SetViewport(newVP);
  242. GUIPoint pt;
  243. pt.x = oldVP.X + ptCursor.x;
  244. pt.y = oldVP.Y + ptCursor.y;
  245. float depth = GetDepth_BinarySearch(pt, 0.0f, 1.0f, 1);
  246. pRS->SetViewport(oldVP);
  247. Matrix mtxProjectionInv = pRS->GetProjection();
  248. mtxProjectionInv.InverseComplette4X4();
  249. double z = mtxProjectionInv.m[2][2] * depth + mtxProjectionInv.m[3][2];
  250. double w = mtxProjectionInv.m[2][3] * depth + mtxProjectionInv.m[3][3];
  251. distToCamera = z / w;
  252. Vector start, end;
  253. ExtractRay (viewport, ptCursor, start, end);
  254. Vector dir = (end - start);
  255. dir.Normalize();
  256. Vector pos = start + (dir * distToCamera);
  257. //pRS->Print(0, 0, 0xFFFFFFFF, "depth %f, dist : %f", depth, distToCamera);
  258. return pos;
  259. }
  260. void MoveController::MouseMove (const GUIPoint &ptCursor, const RENDERVIEWPORT& viewport)
  261. {
  262. if (!Active) return;
  263. //--------------------------
  264. if (!bPressed)
  265. {
  266. Vector r1, r2;
  267. ExtractRay (viewport, ptCursor, r1, r2);
  268. Line mouse_line(r1, r2);
  269. //pRS->DrawLine(r1, 0xFFFFFFFF, r2, 0xFFFFFFFF);
  270. Mode = DISABLE;
  271. bool result = false;
  272. result = AxisX.IntersectionLines(mouse_line, pivot, 0.05f*AxisScale);
  273. float CurDistance = 999999999.0f;
  274. Vector CamPos = pRS->GetView().GetCamPos();
  275. if (result)
  276. {
  277. if ((pivot.x >= AxisX.p1.x) && (pivot.x <= AxisX.p2.x))
  278. {
  279. float cDistnace = (CamPos-pivot).GetLength();
  280. if (cDistnace < CurDistance)
  281. {
  282. Mode = X_AXIS;
  283. CurDistance = cDistnace;
  284. }
  285. }
  286. }
  287. result = AxisY.IntersectionLines(mouse_line, pivot, 0.05f*AxisScale);
  288. if (result)
  289. {
  290. if ((pivot.y >= AxisY.p1.y) && (pivot.y <= AxisY.p2.y))
  291. {
  292. float cDistnace = (CamPos-pivot).GetLength();
  293. if (cDistnace < CurDistance)
  294. {
  295. Mode = Y_AXIS;
  296. CurDistance = cDistnace;
  297. }
  298. }
  299. }
  300. result = AxisZ.IntersectionLines(mouse_line, pivot, 0.05f*AxisScale);
  301. if (result)
  302. {
  303. if ((pivot.z >= AxisZ.p1.z) && (pivot.z <= AxisZ.p2.z))
  304. {
  305. float cDistnace = (CamPos-pivot).GetLength();
  306. if (cDistnace < CurDistance)
  307. {
  308. Mode = Z_AXIS;
  309. CurDistance = cDistnace;
  310. }
  311. }
  312. }
  313. return;
  314. }
  315. //---------------------------------------------
  316. Vector mCursor;
  317. mCursor.x = (float)ptCursor.x;
  318. mCursor.y = (float)ptCursor.y;
  319. mCursor.z = 0.0f;
  320. Vector relCursor = (mCursor - v1.v);
  321. newCursorPos = v1.v + ((relCursor | sNormal) * sNormal);
  322. GUIPoint newPosition;
  323. newPosition.x = (int)newCursorPos.x;
  324. newPosition.y = (int)newCursorPos.y;
  325. Vector r1, r2;
  326. ExtractRay (viewport, newPosition, r1, r2);
  327. Line mouse_line(r1, r2);
  328. Vector p;
  329. if (Mode == X_AXIS)
  330. {
  331. AxisX.IntersectionLines(mouse_line, p, 0.05f*AxisScale);
  332. PositionAttribute* f_attr = GetFirstPO_FromSelectedObject ();
  333. if (f_attr)
  334. {
  335. Vector xvec = f_attr->GetValue();
  336. float delta = (p.x - pivot.x);
  337. //if (delta > 100.0f) delta = 100.0f;
  338. xvec.x += delta;
  339. if (ValidValue (xvec))
  340. {
  341. if (f_attr->GetIsLimit())
  342. {
  343. if (xvec.x < f_attr->GetMin().x) xvec.x = f_attr->GetMin().x;
  344. if (xvec.x > f_attr->GetMax().x) xvec.x = f_attr->GetMax().x;
  345. }
  346. f_attr->SetValue(xvec);
  347. pivot = p;
  348. MissionEditor::tCreatedMO* curNode = GetSelectedObject ();
  349. MOPWriter wrt(curNode->Level, curNode->pObject.SPtr()->GetObjectID().c_str());
  350. curNode->AttrList->AddToWriter (wrt);
  351. #ifndef NO_TOOLS
  352. miss->EditorUpdateObject(curNode->pObject.Ptr(), wrt);
  353. #endif
  354. //curNode->pObject->EditMode_Update (wrt.Reader ());
  355. }
  356. }
  357. }
  358. if (Mode == Y_AXIS)
  359. {
  360. AxisY.IntersectionLines(mouse_line, p, 0.05f*AxisScale);
  361. PositionAttribute* f_attr = GetFirstPO_FromSelectedObject ();
  362. if (f_attr)
  363. {
  364. Vector xvec = f_attr->GetValue();
  365. float delta = (p.y - pivot.y);
  366. //if (delta > 100.0f) delta = 100.0f;
  367. xvec.y += delta;
  368. if (ValidValue (xvec))
  369. {
  370. if (f_attr->GetIsLimit())
  371. {
  372. if (xvec.y < f_attr->GetMin().y) xvec.y = f_attr->GetMin().y;
  373. if (xvec.y > f_attr->GetMax().y) xvec.y = f_attr->GetMax().y;
  374. }
  375. f_attr->SetValue(xvec);
  376. pivot = p;
  377. MissionEditor::tCreatedMO* curNode = GetSelectedObject ();
  378. MOPWriter wrt(curNode->Level, curNode->pObject.Ptr()->GetObjectID().c_str());
  379. curNode->AttrList->AddToWriter (wrt);
  380. #ifndef NO_TOOLS
  381. miss->EditorUpdateObject(curNode->pObject.Ptr(), wrt);
  382. #endif
  383. //curNode->pObject->EditMode_Update (wrt.Reader ());
  384. }
  385. }
  386. }
  387. if (Mode == Z_AXIS)
  388. {
  389. AxisZ.IntersectionLines(mouse_line, p, 0.05f*AxisScale);
  390. PositionAttribute* f_attr = GetFirstPO_FromSelectedObject ();
  391. if (f_attr)
  392. {
  393. Vector xvec = f_attr->GetValue();
  394. float delta = (p.z - pivot.z);
  395. //if (delta > 100.0f) delta = 100.0f;
  396. xvec.z += delta;
  397. if (ValidValue (xvec))
  398. {
  399. if (f_attr->GetIsLimit())
  400. {
  401. if (xvec.z < f_attr->GetMin().z) xvec.z = f_attr->GetMin().z;
  402. if (xvec.z > f_attr->GetMax().z) xvec.z = f_attr->GetMax().z;
  403. }
  404. f_attr->SetValue(xvec);
  405. pivot = p;
  406. MissionEditor::tCreatedMO* curNode = GetSelectedObject ();
  407. MOPWriter wrt(curNode->Level, curNode->pObject.Ptr()->GetObjectID().c_str());
  408. curNode->AttrList->AddToWriter (wrt);
  409. #ifndef NO_TOOLS
  410. miss->EditorUpdateObject(curNode->pObject.Ptr(), wrt);
  411. #endif
  412. //curNode->pObject->EditMode_Update (wrt.Reader ());
  413. }
  414. }
  415. }
  416. //---------------------------------------------
  417. }
  418. bool MoveController::ButtonIsPressed (bool bPressed, const GUIPoint &ptCursor, const RENDERVIEWPORT& viewport)
  419. {
  420. if (!Active) return true;
  421. //"Липкая" таскалка с шифтом
  422. if (bStickyMove && bPressed == true)
  423. {
  424. double distToCam = 0;
  425. Vector wp = GetWorldPositionUnderMouse (ptCursor, viewport, distToCam);
  426. if (bStickyUpOffset)
  427. {
  428. wp.y += 0.5f;
  429. }
  430. //слишком далеко не ставим
  431. if (distToCam < 1500.0f)
  432. {
  433. PositionAttribute* f_attr = GetFirstPO_FromSelectedObject ();
  434. if (f_attr)
  435. {
  436. Vector xvec = wp;
  437. if (ValidValue (xvec))
  438. {
  439. if (f_attr->GetIsLimit())
  440. {
  441. if (xvec.x < f_attr->GetMin().x) xvec.x = f_attr->GetMin().x;
  442. if (xvec.x > f_attr->GetMax().x) xvec.x = f_attr->GetMax().x;
  443. if (xvec.y < f_attr->GetMin().y) xvec.y = f_attr->GetMin().y;
  444. if (xvec.y > f_attr->GetMax().y) xvec.y = f_attr->GetMax().y;
  445. if (xvec.z < f_attr->GetMin().z) xvec.z = f_attr->GetMin().z;
  446. if (xvec.z > f_attr->GetMax().z) xvec.z = f_attr->GetMax().z;
  447. }
  448. f_attr->SetValue(xvec);
  449. MissionEditor::tCreatedMO* curNode = GetSelectedObject ();
  450. MOPWriter wrt(curNode->Level, curNode->pObject.SPtr()->GetObjectID().c_str());
  451. curNode->AttrList->AddToWriter (wrt);
  452. #ifndef NO_TOOLS
  453. miss->EditorUpdateObject(curNode->pObject.Ptr(), wrt);
  454. #endif
  455. }
  456. }
  457. //pRS->DrawSphere(wp, 0.1f, 0xFFFFFFFF);
  458. }
  459. return true;
  460. }
  461. if (bPressed == false)
  462. {
  463. PositionAttribute* f_attr = GetFirstPO_FromSelectedObject ();
  464. if (f_attr)
  465. {
  466. pEditableNode = f_attr;
  467. //MainWindow->UpdateTree(NULL);
  468. GUITreeNode* sNode = MainWindow->TreeView1->GetSelectedNode ();
  469. if (sNode->Tag == TAG_ATTRIBUTE)
  470. {
  471. BaseAttribute* pBaseNode = (BaseAttribute*)sNode->Data;
  472. pBaseNode->UpdateTree(sNode);
  473. }
  474. }
  475. }
  476. if (Mode == DISABLE) return false;
  477. if (Mode == X_AXIS)
  478. {
  479. Matrix mVP(pRS->GetView(), ViewPortProjectionMatrix);
  480. v1 = mVP.Projection(AxisX.p1, viewport.Width * 0.5f, viewport.Height * 0.5f);
  481. v2 = mVP.Projection(AxisX.p2, viewport.Width * 0.5f, viewport.Height * 0.5f);
  482. }
  483. if (Mode == Y_AXIS)
  484. {
  485. Matrix mVP(pRS->GetView(), ViewPortProjectionMatrix);
  486. v1 = mVP.Projection(AxisY.p1, viewport.Width * 0.5f, viewport.Height * 0.5f);
  487. v2 = mVP.Projection(AxisY.p2, viewport.Width * 0.5f, viewport.Height * 0.5f);
  488. }
  489. if (Mode == Z_AXIS)
  490. {
  491. Matrix mVP(pRS->GetView(), ViewPortProjectionMatrix);
  492. v1 = mVP.Projection(AxisZ.p1, viewport.Width * 0.5f, viewport.Height * 0.5f);
  493. v2 = mVP.Projection(AxisZ.p2, viewport.Width * 0.5f, viewport.Height * 0.5f);
  494. }
  495. sNormal = !(v2.v - v1.v);
  496. sNormal.z = 0.0f;
  497. this->bPressed = bPressed;
  498. return true;
  499. }
  500. bool MoveController::ValidValue (const Vector &vec)
  501. {
  502. //float fDistance = sqrtf(~(vec - pRS->GetView().GetCamPos()));
  503. //if (fDistance < 0.01f) return false;
  504. //if (fDistance > 100.0f) return false;
  505. return true;
  506. }