mainwindow.cpp 64 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426
  1. #ifndef _XBOX
  2. //****************************************************************
  3. #include "mainwindow.h"
  4. #include "rename.h"
  5. #include "projectbrowser.h"
  6. #include "..\EditorMain.h"
  7. #include "..\..\..\common_h\particles.h"
  8. #include "..\..\..\Common_h\FileService.h"
  9. #include "..\..\..\common_h\gmx.h"
  10. #include "..\arcball\ArcBall.h"
  11. #include "..\..\manager\particlemanager.h"
  12. #include "..\..\system\ParticleSystem\particlesystem.h"
  13. #include "..\..\icommon\iemitter.h"
  14. #include "..\..\icommon\names.h"
  15. #include "..\..\icommon\editortypes.h"
  16. #include "..\..\system\datasource\databool.h"
  17. #include "..\..\system\datasource\datacolor.h"
  18. #include "..\..\system\datasource\datafloat.h"
  19. #include "..\..\system\datasource\datagraph.h"
  20. #include "..\..\system\datasource\dataposition.h"
  21. #include "..\..\system\datasource\datauv.h"
  22. #include "..\..\system\datasource\datastring.h"
  23. #include "..\editors\graph.h"
  24. #include "..\editors\uv.h"
  25. #include "..\editors\color.h"
  26. #include "..\editors\bool.h"
  27. #include "..\editors\float.h"
  28. #include "..\editors\position.h"
  29. #include "..\editors\string.h"
  30. #include "..\customcontrols\strutil.h"
  31. #include "choosename.h"
  32. #include "..\..\gizmo\gizmo.h"
  33. #define ZERO_TEXTURE_NAME "not_found"
  34. #define WINDOW_POSX 0
  35. #define WINDOW_POSY 0
  36. #define WINDOW_WIDTH 800
  37. #define WINDOW_HEIGHT 600
  38. #define SAVEDOK_SHOWTIME 0.3f
  39. #define SAVEDOK_MESSAGE "File, saved complete"
  40. extern char IniStringBuffer[];
  41. extern IGUIManager* Application;
  42. extern ParticleEditor* pEditor;
  43. string __tmp;
  44. bool TMainWindow::FuncCompare (GUITreeNode* const &a1, GUITreeNode* const &a2)
  45. {
  46. if (crt_stricmp(a1->GetText(), a2->GetText()) < 0) return true;
  47. return false;
  48. }
  49. TMainWindow::TMainWindow () : GUIWindow (NULL, WINDOW_POSX, WINDOW_POSY, WINDOW_WIDTH, WINDOW_HEIGHT), UndoEntry(_FL_),
  50. ExpandedNode(_FL_)
  51. {
  52. fTimeAfterRestart = 999.0f;
  53. bLowFPS = false;
  54. TimeFromLastAutoSave = 0.0f;
  55. AutoSaveIndex = 0;
  56. MaxAutoSaveSlots = 20;
  57. bDrawGrid = true;
  58. pGeom = NULL;
  59. GZM_move_index = 0;
  60. GZM_rotate_index = 1;
  61. bShowAxis = false;
  62. SystemIsPaused = false;
  63. SystemIsSlowMode = false;
  64. SaveOKTime = 0;
  65. UndoSelectNode = false;
  66. PositionInUndoBuffer = -1;
  67. NowEdited = NULL;
  68. pBackgroundTexture = NULL;
  69. IFileService* pFS = (IFileService*)api->GetService("FileService");
  70. IIniFile* pIni = pFS->SystemIni();
  71. Assert(pIni);
  72. const char* szBackground = pIni->GetString("peditor", "backgroundname", NULL);
  73. if (szBackground)
  74. {
  75. pBackgroundTexture = pEditor->Render()->CreateTexture(_FL_, szBackground);
  76. if (pBackgroundTexture->GetWidth() <= 4 && pBackgroundTexture->GetHeight() <= 4)
  77. {
  78. pBackgroundTexture->Release();
  79. pBackgroundTexture = NULL;
  80. }
  81. }
  82. Matrix mGizmoTransform;
  83. mGizmoTransform.m[0][0] = pIni->GetFloat("peditor", "m_0_0", 1.0f);
  84. mGizmoTransform.m[0][1] = pIni->GetFloat("peditor", "m_1_0", 0.0f);
  85. mGizmoTransform.m[0][2] = pIni->GetFloat("peditor", "m_2_0", 0.0f);
  86. mGizmoTransform.m[1][0] = pIni->GetFloat("peditor", "m_0_1", 0.0f);
  87. mGizmoTransform.m[1][1] = pIni->GetFloat("peditor", "m_1_1", 1.0f);
  88. mGizmoTransform.m[1][2] = pIni->GetFloat("peditor", "m_2_1", 0.0f);
  89. mGizmoTransform.m[2][0] = pIni->GetFloat("peditor", "m_0_2", 0.0f);
  90. mGizmoTransform.m[2][1] = pIni->GetFloat("peditor", "m_1_2", 0.0f);
  91. mGizmoTransform.m[2][2] = pIni->GetFloat("peditor", "m_2_2", 1.0f);
  92. mGizmoTransform.m[3][0] = pIni->GetFloat("peditor", "m_0_3", 0.0f);
  93. mGizmoTransform.m[3][1] = pIni->GetFloat("peditor", "m_1_3", 0.0f);
  94. mGizmoTransform.m[3][2] = pIni->GetFloat("peditor", "m_2_3", 0.0f);
  95. pEditor->GetGizmo()->SetTransform(mGizmoTransform);
  96. pIni->Release();
  97. const RENDERSCREEN& ScreenInfo = pEditor->Render()->GetScreenInfo3D();
  98. SetWidth(ScreenInfo.dwWidth);
  99. SetHeight(ScreenInfo.dwHeight);
  100. // pArcBall.SetRadius(10.0f);
  101. // SetWidth(pRS->GetScreenInfo3D().dwWidth);
  102. // SetHeight(pRS->GetScreenInfo3D().dwHeight);
  103. bPopupStyle = true;
  104. bSystemButton = false;
  105. Caption = "Particles editor";
  106. pFont->SetSize (16);
  107. TreeView1 = NEW GUITreeView (this, 5, 4, 208, DrawRect.h-20);
  108. TreeView1->FontColor = 0xFF000000;
  109. TreeView1->SetImagesArray ("gtree");
  110. TreeView1->Items->Clear ();
  111. TreeView1->bDragAndDrop = false;
  112. TreeView1->pFont->SetName("arialcyrsmall");
  113. TreeView1->MakeFlat(true);
  114. TreeView1->OnDblClick = (CONTROL_EVENT)&TMainWindow::ShowHideParticle;
  115. TreeView1->OnChange = (CONTROL_EVENT)&TMainWindow::TreeViewChangeNode;
  116. btnNewParticleSystem= NEW GUIButton(this, 218, 5, 24, 24);
  117. btnNewParticleSystem->Glyph->Load ("peditor\\create");
  118. btnNewParticleSystem->FontColor = 0xFF000000;
  119. btnNewParticleSystem->pFont->SetSize (16);
  120. btnNewParticleSystem->Hint = "Create empty system (Ctrl+N)";
  121. btnNewParticleSystem->FlatButton = true;
  122. btnNewParticleSystem->OnMousePressed = (CONTROL_EVENT)&TMainWindow::OnCreateNewSystem;
  123. btnOpenParticleSystem= NEW GUIButton(this, 218+27, 5, 24, 24);
  124. btnOpenParticleSystem->Glyph->Load ("peditor\\open");
  125. btnOpenParticleSystem->FontColor = 0xFF000000;
  126. btnOpenParticleSystem->pFont->SetSize (16);
  127. btnOpenParticleSystem->Hint = "Open existing particle system (Ctrl+O)";
  128. btnOpenParticleSystem->FlatButton = true;
  129. btnOpenParticleSystem->OnMousePressed = (CONTROL_EVENT)&TMainWindow::OpenNewSystemPressed;
  130. btnSaveParticleSystem= NEW GUIButton(this, 218+(27*2), 5, 24, 24);
  131. btnSaveParticleSystem->Glyph->Load ("peditor\\save");
  132. btnSaveParticleSystem->DisabledGlyph->Load ("disabledsave");
  133. btnSaveParticleSystem->FontColor = 0xFF000000;
  134. btnSaveParticleSystem->pFont->SetSize (16);
  135. btnSaveParticleSystem->Hint = "Save particle system (Ctrl+S)";
  136. btnSaveParticleSystem->FlatButton = true;
  137. //btnSaveParticleSystem->bEnabled = false;
  138. btnSaveParticleSystem->OnMousePressed = (CONTROL_EVENT)&TMainWindow::SavePressed;
  139. btnSaveAsParticleSystem= NEW GUIButton(this, 218+(27*3), 5, 24, 24);
  140. btnSaveAsParticleSystem->Glyph->Load ("peditor\\saveas");
  141. btnSaveAsParticleSystem->FontColor = 0xFF000000;
  142. btnSaveAsParticleSystem->pFont->SetSize (16);
  143. btnSaveAsParticleSystem->Hint = "Save as... (Ctrl+Shift+S)";
  144. btnSaveAsParticleSystem->FlatButton = true;
  145. btnSaveAsParticleSystem->OnMousePressed = (CONTROL_EVENT)&TMainWindow::SaveAsPressed;
  146. btnCreatePointEmitter = NEW GUIButton(this, 218+5+(27*4), 5, 24, 24);
  147. btnCreatePointEmitter->Glyph->Load ("peditor\\addpoint");
  148. btnCreatePointEmitter->FontColor = 0xFF000000;
  149. btnCreatePointEmitter->pFont->SetSize (16);
  150. btnCreatePointEmitter->Hint = "Create point emitter (Alt+P)";
  151. btnCreatePointEmitter->FlatButton = true;
  152. btnCreatePointEmitter->OnMousePressed = (CONTROL_EVENT)&TMainWindow::CreatePointEmitterPressed;
  153. /*
  154. btnCreateBoxEmitter = NEW GUIButton(this, 218+5+(27*5), 5, 24, 24);
  155. btnCreateBoxEmitter->Glyph->Load ("peditor\\addbox");
  156. btnCreateBoxEmitter->DisabledGlyph->Load ("peditor\\addboxd");
  157. btnCreateBoxEmitter->FontColor = 0xFF000000;
  158. btnCreateBoxEmitter->pFont->SetSize (16);
  159. btnCreateBoxEmitter->Hint = "Create box emitter (Alt+B)";
  160. btnCreateBoxEmitter->FlatButton = true;
  161. btnCreateBoxEmitter->bEnabled = false;
  162. btnCreateSphereEmitter = NEW GUIButton(this, 218+5+(27*6), 5, 24, 24);
  163. btnCreateSphereEmitter->Glyph->Load ("peditor\\addsphere");
  164. btnCreateSphereEmitter->DisabledGlyph->Load ("peditor\\addsphered");
  165. btnCreateSphereEmitter->FontColor = 0xFF000000;
  166. btnCreateSphereEmitter->pFont->SetSize (16);
  167. btnCreateSphereEmitter->Hint = "Create sphere emitter (Alt+S)";
  168. btnCreateSphereEmitter->FlatButton = true;
  169. btnCreateSphereEmitter->bEnabled = false;
  170. btnCreateLineEmitter = NEW GUIButton(this, 218+5+(27*7), 5, 24, 24);
  171. btnCreateLineEmitter->Glyph->Load ("peditor\\addline");
  172. btnCreateLineEmitter->DisabledGlyph->Load ("peditor\\addlined");
  173. btnCreateLineEmitter->FontColor = 0xFF000000;
  174. btnCreateLineEmitter->pFont->SetSize (16);
  175. btnCreateLineEmitter->Hint = "Create line emitter";
  176. btnCreateLineEmitter->FlatButton = true;
  177. btnCreateLineEmitter->bEnabled = false;
  178. btnCreateModelEmitter = NEW GUIButton(this, 218+5+(27*8), 5, 24, 24);
  179. btnCreateModelEmitter->Glyph->Load ("peditor\\addmodel");
  180. btnCreateModelEmitter->DisabledGlyph->Load ("peditor\\addmodeld");
  181. btnCreateModelEmitter->FontColor = 0xFF000000;
  182. btnCreateModelEmitter->pFont->SetSize (16);
  183. btnCreateModelEmitter->Hint = "Create model emitter (Alt+M)";
  184. btnCreateModelEmitter->FlatButton = true;
  185. btnCreateModelEmitter->bEnabled = false;
  186. */
  187. btnDelete = NEW GUIButton(this, 218+15+(27*5), 5, 24, 24);
  188. btnDelete->Glyph->Load ("peditor\\delete");
  189. btnDelete->FontColor = 0xFF000000;
  190. btnDelete->pFont->SetSize (16);
  191. btnDelete->Hint = "Delete item (Ctrl+Del)";
  192. btnDelete->FlatButton = true;
  193. btnDelete->OnMousePressed = (CONTROL_EVENT)&TMainWindow::DeleteObjectPressed;
  194. btnCreateBillBoardParticle = NEW GUIButton(this, 218+15+(27*6), 5, 24, 24);
  195. btnCreateBillBoardParticle->Glyph->Load ("peditor\\addbillboard");
  196. btnCreateBillBoardParticle->FontColor = 0xFF000000;
  197. btnCreateBillBoardParticle->pFont->SetSize (16);
  198. btnCreateBillBoardParticle->Hint = "Create billboard particle\nin selected emitter (Alt+B)";
  199. btnCreateBillBoardParticle->FlatButton = true;
  200. btnCreateBillBoardParticle->OnMousePressed = (CONTROL_EVENT)&TMainWindow::CreateBillboardPressed;
  201. btnCreateModelParticle = NEW GUIButton(this, 218+15+(27*7), 5, 24, 24);
  202. btnCreateModelParticle->Glyph->Load ("peditor\\addmpart");
  203. btnCreateModelParticle->FontColor = 0xFF000000;
  204. btnCreateModelParticle->pFont->SetSize (16);
  205. btnCreateModelParticle->Hint = "Create model particle\nin selected emitter (Alt+M)";
  206. btnCreateModelParticle->FlatButton = true;
  207. btnCreateModelParticle->OnMousePressed = (CONTROL_EVENT)&TMainWindow::CreateModelPressed;
  208. btnShowGrid = NEW GUIButton(this, 218+20+(27*8), 5, 24, 24);
  209. btnShowGrid->Glyph->Load ("peditor\\grid");
  210. btnShowGrid->DisabledGlyph->Load ("peditor\\grid");
  211. btnShowGrid->FontColor = 0xFF000000;
  212. btnShowGrid->pFont->SetSize (16);
  213. btnShowGrid->Hint = "Show grid";
  214. btnShowGrid->FlatButton = true;
  215. btnShowGrid->GroupIndex = 33;
  216. btnShowGrid->Down = true;
  217. btnShowGrid->OnMousePressed = (CONTROL_EVENT)&TMainWindow::btnShowGridPressed;
  218. btnShowDirection = NEW GUIButton(this, 218+20+(27*9), 5, 24, 24);
  219. btnShowDirection->Glyph->Load ("peditor\\show_dir");
  220. btnShowDirection->DisabledGlyph->Load ("peditor\\show_dird");
  221. btnShowDirection->FontColor = 0xFF000000;
  222. btnShowDirection->pFont->SetSize (16);
  223. btnShowDirection->Hint = "Show emission direction\nOn current emitter";
  224. btnShowDirection->FlatButton = true;
  225. btnShowDirection->GroupIndex = 1;
  226. btnShowDirection->OnMousePressed = (CONTROL_EVENT)&TMainWindow::btnShowDirPressed;
  227. btnRenameObject = NEW GUIButton(this, 218+20+(27*10), 5, 24, 24);
  228. btnRenameObject->Glyph->Load ("peditor\\rename");
  229. btnRenameObject->FontColor = 0xFF000000;
  230. btnRenameObject->pFont->SetSize (16);
  231. btnRenameObject->Hint = "Rename current object (F6)";
  232. btnRenameObject->FlatButton = true;
  233. btnRenameObject->OnMousePressed = (CONTROL_EVENT)&TMainWindow::RenameObjectPressed;
  234. btnEmulateLOWFps = NEW GUIButton(this, 218+10+(27*12), 5, 24, 24);
  235. btnEmulateLOWFps->Glyph->Load ("peditor\\undo");
  236. btnEmulateLOWFps->DisabledGlyph->Load ("peditor\\undod");
  237. btnEmulateLOWFps->FontColor = 0xFF000000;
  238. btnEmulateLOWFps->pFont->SetSize (16);
  239. btnEmulateLOWFps->Hint = "Undo (Ctrl+Z)";
  240. btnEmulateLOWFps->FlatButton = true;
  241. btnEmulateLOWFps->OnMousePressed = (CONTROL_EVENT)&TMainWindow::UndoPressed;
  242. btnSelectAmbientColor = NEW GUIButton(this, 218+10+(27*13), 5, 24, 24);
  243. btnSelectAmbientColor->Glyph->Load ("peditor\\colorch");
  244. btnSelectAmbientColor->DisabledGlyph->Load ("peditor\\colorch");
  245. btnSelectAmbientColor->FontColor = 0xFF000000;
  246. btnSelectAmbientColor->pFont->SetSize (16);
  247. btnSelectAmbientColor->Hint = "Select ambient color";
  248. btnSelectAmbientColor->FlatButton = true;
  249. btnSelectAmbientColor->OnMousePressed = (CONTROL_EVENT)&TMainWindow::AmbientSelect;
  250. //btnSelectAmbientColor->bEnabled = false;
  251. btnSelectDirectionColor = NEW GUIButton(this, 218+10+(27*14), 5, 24, 24);
  252. btnSelectDirectionColor->Glyph->Load ("peditor\\colorch");
  253. btnSelectDirectionColor->DisabledGlyph->Load ("peditor\\colorch");
  254. btnSelectDirectionColor->FontColor = 0xFF000000;
  255. btnSelectDirectionColor->pFont->SetSize (16);
  256. btnSelectDirectionColor->Hint = "Select directional color";
  257. btnSelectDirectionColor->FlatButton = true;
  258. btnSelectDirectionColor->OnMousePressed = (CONTROL_EVENT)&TMainWindow::DirectionalSelect;
  259. btnRestartSystem = NEW GUIButton(this, 218+30+(27*15), 5, 24, 24);
  260. btnRestartSystem->Glyph->Load ("peditor\\restart");
  261. btnRestartSystem->FontColor = 0xFF000000;
  262. btnRestartSystem->pFont->SetSize (16);
  263. btnRestartSystem->Hint = "Restart system (Ctrl+P)";
  264. btnRestartSystem->FlatButton = true;
  265. btnRestartSystem->OnMousePressed = (CONTROL_EVENT)&TMainWindow::RestartSystem;
  266. //btnRestartSystem->GroupIndex = 33;
  267. btnPauseSystem = NEW GUIButton(this, 218+30+(27*16), 5, 24, 24);
  268. btnPauseSystem->Glyph->Load ("peditor\\pause");
  269. btnPauseSystem->FontColor = 0xFF000000;
  270. btnPauseSystem->pFont->SetSize (16);
  271. btnPauseSystem->Hint = "Pause system (Ctrl+I)";
  272. btnPauseSystem->FlatButton = true;
  273. btnPauseSystem->OnMousePressed = (CONTROL_EVENT)&TMainWindow::PausePressed;
  274. btnPauseSystem->GroupIndex = 33;
  275. btnSlowMotionSystem = NEW GUIButton(this, 218+30+(27*17), 5, 24, 24);
  276. btnSlowMotionSystem->Glyph->Load ("peditor\\slowmo");
  277. btnSlowMotionSystem->FontColor = 0xFF000000;
  278. btnSlowMotionSystem->pFont->SetSize (16);
  279. btnSlowMotionSystem->Hint = "Enable SlowMotion (Ctrl+O)";
  280. btnSlowMotionSystem->FlatButton = true;
  281. btnSlowMotionSystem->OnMousePressed = (CONTROL_EVENT)&TMainWindow::SlowMotionPressed;
  282. btnSlowMotionSystem->GroupIndex = 33;
  283. btnSelectBackgroundTexture = NEW GUIButton(this, 218+30+15+(27*18), 5, 24, 24);
  284. btnSelectBackgroundTexture->Glyph->Load ("peditor\\selectback");
  285. btnSelectBackgroundTexture->FontColor = 0xFF000000;
  286. btnSelectBackgroundTexture->pFont->SetSize (16);
  287. btnSelectBackgroundTexture->Hint = "Select background texture";
  288. btnSelectBackgroundTexture->FlatButton = true;
  289. btnSelectBackgroundTexture->OnMousePressed = (CONTROL_EVENT)&TMainWindow::SelectBackgroundPressed;
  290. //btnSelectBackgroundTexture->GroupIndex = 33;
  291. btnSimpleMode = NEW GUIButton(this, 218+38+15+(27*19), 5, 24, 24);
  292. btnSimpleMode->Glyph->Load ("peditor\\m_simple");
  293. btnSimpleMode->FontColor = 0xFF000000;
  294. btnSimpleMode->pFont->SetSize (16);
  295. btnSimpleMode->Hint = "Simple mode";
  296. btnSimpleMode->FlatButton = true;
  297. btnSimpleMode->OnMousePressed = (CONTROL_EVENT)&TMainWindow::btnSimplePressed;
  298. btnSimpleMode->GroupIndex = 33;
  299. btnSimpleMode->Down = true;
  300. btnMoveMode = NEW GUIButton(this, 218+38+15+(27*20), 5, 24, 24);
  301. btnMoveMode->Glyph->Load ("peditor\\m_move");
  302. btnMoveMode->FontColor = 0xFF000000;
  303. btnMoveMode->pFont->SetSize (16);
  304. btnMoveMode->Hint = "Move geometry mode";
  305. btnMoveMode->FlatButton = true;
  306. btnMoveMode->OnMousePressed = (CONTROL_EVENT)&TMainWindow::btnMovePressed;
  307. btnMoveMode->GroupIndex = 33;
  308. btnRotateMode = NEW GUIButton(this, 218+38+15+(27*21), 5, 24, 24);
  309. btnRotateMode->Glyph->Load ("peditor\\m_rotate");
  310. btnRotateMode->FontColor = 0xFF000000;
  311. btnRotateMode->pFont->SetSize (16);
  312. btnRotateMode->Hint = "Rotate geometry mode";
  313. btnRotateMode->FlatButton = true;
  314. btnRotateMode->OnMousePressed = (CONTROL_EVENT)&TMainWindow::btnRotatePressed;
  315. btnRotateMode->GroupIndex = 33;
  316. bGizmoMode = NEW GUIComboBox(this, 218+38+15+(27*22), 10, 100, 16);
  317. bGizmoMode->ListBox->Items.Add("World");
  318. bGizmoMode->ListBox->Items.Add("Local");
  319. bGizmoMode->MakeFlat(true);
  320. bGizmoMode->OnChange = (CONTROL_EVENT)&TMainWindow::btnGizmoTypeChanged;
  321. bGizmoMode->SelectItem(0);
  322. btnLoadGeom = NEW GUIButton(this, 218+38+15+(27*26), 5, 24, 24);
  323. btnLoadGeom->Glyph->Load ("peditor\\m_gmx");
  324. btnLoadGeom->FontColor = 0xFF000000;
  325. btnLoadGeom->pFont->SetSize (16);
  326. btnLoadGeom->Hint = "Load GMX file";
  327. btnLoadGeom->FlatButton = true;
  328. btnLoadGeom->OnMousePressed = (CONTROL_EVENT)&TMainWindow::btnLoadGMXPressed;
  329. btnResetTransform = NEW GUIButton(this, 218+38+15+(27*27), 5, 24, 24);
  330. btnResetTransform->Glyph->Load ("peditor\\m_reset");
  331. btnResetTransform->FontColor = 0xFF000000;
  332. btnResetTransform->pFont->SetSize (16);
  333. btnResetTransform->Hint = "Reset transform";
  334. btnResetTransform->FlatButton = true;
  335. btnResetTransform->OnMousePressed = (CONTROL_EVENT)&TMainWindow::btnResetTransformPressed;
  336. //
  337. ViewPortWidth = DrawRect.w - 230;
  338. ViewPortHeight = (int)(ViewPortWidth / 1.8f);
  339. ViewPort1 = NEW GUIViewPort (this, 220, 40, ViewPortWidth, ViewPortHeight);
  340. ViewPort1->OnRender = (CONTROL_EVENT)&TMainWindow::DrawViewport;
  341. int GraphEditorHeight = DrawRect.h - ViewPortHeight - 65;
  342. Panel1 = NEW GUIPanel (this, 220, ViewPortHeight+40+5, ViewPortWidth, GraphEditorHeight);
  343. BuildBrowserTree ();
  344. MaxUndoPos = 0;
  345. InitUndoSystem (128);
  346. IIniFile* pEngineIni = pFS->SystemIni();
  347. if (pEngineIni)
  348. {
  349. Color amb;
  350. amb.r = pEngineIni->GetFloat("Ambient", "R", 1.0f);
  351. amb.g = pEngineIni->GetFloat("Ambient", "G", 1.0f);
  352. amb.b = pEngineIni->GetFloat("Ambient", "B", 1.0f);
  353. Color dir;
  354. dir.r = pEngineIni->GetFloat("Directional", "R", 1.0f);
  355. dir.g = pEngineIni->GetFloat("Directional", "G", 1.0f);
  356. dir.b = pEngineIni->GetFloat("Directional", "B", 1.0f);
  357. IRender* pRS = (IRender*)api->GetService("DX9Render");
  358. pRS->SetAmbient(amb);
  359. pRS->SetGlobalLight(Vector(0.0f, 1.0f, 0.0f), false, dir, Color(1.0f, 1.0f, 1.0f));
  360. pEngineIni->Release();
  361. pEngineIni = NULL;
  362. }
  363. CreateUndo ();
  364. }
  365. TMainWindow::~TMainWindow ()
  366. {
  367. if (pBackgroundTexture) pBackgroundTexture->Release();
  368. pBackgroundTexture = NULL;
  369. ShutdownUndoSystem ();
  370. //TreeView1->Items->Clear();
  371. }
  372. void TMainWindow::Draw ()
  373. {
  374. if (api->DebugKeyState(VK_CONTROL, 'O'))
  375. {
  376. OpenNewSystemPressed(NULL);
  377. }
  378. fTimeAfterRestart += api->GetDeltaTime();
  379. if (bLowFPS)
  380. {
  381. Sleep(60);
  382. }
  383. Autosave();
  384. GUIWindow::Draw ();
  385. }
  386. void TMainWindow::KeyPressed(int Key, bool bSysKey)
  387. {
  388. GUIWindow::KeyPressed (Key, bSysKey);
  389. if (!IsActive) return;
  390. bool bControlState = false;
  391. bool bAltState = false;
  392. bool bShiftState = false;
  393. if (GetAsyncKeyState(VK_CONTROL) < 0) bControlState = true;
  394. if (GetAsyncKeyState(VK_MENU) < 0) bAltState = true;
  395. if (GetAsyncKeyState(VK_SHIFT) < 0) bShiftState = true;
  396. if (GetAsyncKeyState('Q') < 0)
  397. {
  398. btnSimpleMode->OnPressed();
  399. Sleep(100);
  400. }
  401. if (GetAsyncKeyState('W') < 0)
  402. {
  403. btnMoveMode->OnPressed();
  404. Sleep(100);
  405. }
  406. if (GetAsyncKeyState('E') < 0)
  407. {
  408. btnRotateMode->OnPressed();
  409. Sleep(100);
  410. }
  411. if (GetAsyncKeyState(VK_F6) < 0)
  412. {
  413. //api->Trace("F6 - pressed\n");
  414. RenameObjectPressed (this);
  415. Sleep(120);
  416. }
  417. if (GetAsyncKeyState(VK_RETURN) < 0)
  418. {
  419. ApplyChangeSystem ();
  420. }
  421. if (bAltState)
  422. {
  423. if ((GetAsyncKeyState('P') < 0) && (fTimeAfterRestart > 1.0f))
  424. {
  425. CreatePointEmitterPressed (NULL);
  426. fTimeAfterRestart = 0.0f;
  427. //Sleep (150);
  428. }
  429. if (GetAsyncKeyState('B') < 0)
  430. {
  431. CreateBillboardPressed (NULL);
  432. Sleep (150);
  433. }
  434. if (GetAsyncKeyState('M') < 0)
  435. {
  436. CreateModelPressed (NULL);
  437. Sleep (150);
  438. }
  439. }
  440. if (bControlState)
  441. {
  442. if (GetAsyncKeyState('I') < 0)
  443. {
  444. PausePressed(NULL);
  445. Sleep (80);
  446. }
  447. if (GetAsyncKeyState('O') < 0)
  448. {
  449. OpenNewSystemPressed(NULL);
  450. Sleep (80);
  451. }
  452. if (GetAsyncKeyState('P') < 0)
  453. {
  454. Sleep (80);
  455. ApplyChangeSystem ();
  456. RestartSystem(NULL);
  457. }
  458. if (GetAsyncKeyState(VK_DELETE) < 0)
  459. {
  460. DeleteObjectPressed(NULL);
  461. Sleep (80);
  462. }
  463. if (GetAsyncKeyState('S') < 0)
  464. {
  465. SavePressed (NULL);
  466. Sleep (80);
  467. }
  468. if (GetAsyncKeyState('Z') < 0)
  469. {
  470. Undo ();
  471. Sleep (150);
  472. }
  473. if (GetAsyncKeyState('Y') < 0)
  474. {
  475. Redo ();
  476. Sleep (150);
  477. }
  478. }
  479. }
  480. void _cdecl TMainWindow::DrawViewport (GUIControl* sender)
  481. {
  482. cliper.Push();
  483. pEditor->Render()->Clear(0, NULL, CLEAR_STENCIL | CLEAR_TARGET | CLEAR_ZBUFFER, pEditor->GetBackgroundColor(), 1.0f, 0);
  484. RENDERVIEWPORT vp = pEditor->Render()->GetViewport();
  485. Matrix matOldPrj = pEditor->Render()->GetProjection();
  486. Matrix matView;
  487. pEditor->ArcBall()->BuildViewMatrix(matView);
  488. pEditor->Render()->SetView(matView);
  489. pEditor->Render()->SetPerspective(1.0f, (float)vp.Width, (float)vp.Height);
  490. if (pBackgroundTexture && !pBackgroundTexture->IsError())
  491. {
  492. RS_SPRITE spr[4];
  493. float x1 = -1.0f; float x2 = 1.0f;
  494. float y1 = 1.0f; float y2 = -1.0f;
  495. spr[0].vPos = Vector(x1, y1, 1.0f);
  496. spr[1].vPos = Vector(x2, y1, 1.0f);
  497. spr[2].vPos = Vector(x2, y2, 1.0f);
  498. spr[3].vPos = Vector(x1, y2, 1.0f);
  499. spr[0].dwColor = 0xFFFFFFFF;
  500. spr[1].dwColor = 0xFFFFFFFF;
  501. spr[2].dwColor = 0xFFFFFFFF;
  502. spr[3].dwColor = 0xFFFFFFFF;
  503. spr[0].tu = 0.0f; spr[0].tv = 0.0f;
  504. spr[1].tu = 1.0f; spr[1].tv = 0.0f;
  505. spr[2].tu = 1.0f; spr[2].tv = 1.0f;
  506. spr[3].tu = 0.0f; spr[3].tv = 1.0f;
  507. pEditor->Render()->DrawSprites(pBackgroundTexture,spr, 1);
  508. }
  509. DrawGrid ();
  510. //DrawAxisNavigator ();
  511. pEditor->GetGizmo()->SetView(pEditor->Render()->GetView());
  512. pEditor->GetGizmo()->SetProjection(pEditor->Render()->GetProjection());
  513. pEditor->GetGizmo()->SetViewPort(pEditor->Render()->GetViewport());
  514. Matrix mCubeTransform = pEditor->GetGizmo()->GetTransform();
  515. //pEditor->Render()->DrawSolidBox(Vector(-1.0f), Vector(1.0f), mCubeTransform);
  516. if (pGeom)
  517. {
  518. pGeom->SetDynamicLightState(false);
  519. pGeom->SetTransform(mCubeTransform);
  520. pGeom->Draw();
  521. }
  522. pEditor->GetGizmo()->Draw();
  523. float DeltaTime = 0.0f;
  524. if (!SystemIsPaused) DeltaTime = api->GetDeltaTime();
  525. if (SystemIsSlowMode) DeltaTime *= 0.1f;
  526. pEditor->Manager()->Execute(DeltaTime);
  527. pEditor->Manager()->DrawAllParticles();
  528. if (bShowAxis)
  529. {
  530. GUITreeNode* TNode = TreeView1->GetSelectedNode();
  531. if (TNode && TNode->Tag == ET_POINT_EMITTER)
  532. {
  533. IEmitter* pEmiter = (IEmitter*)TNode->Data;
  534. Matrix EmissionDir = pEmiter->GetTransform();
  535. pEditor->Render()->DrawMatrix(EmissionDir);
  536. pEditor->Render()->Print(Vector(0.0f, 1.2f, 0.0f)*EmissionDir, 100.0f, 0, 0xFFFF0000, "Y");
  537. pEditor->Render()->Print(Vector(1.2f, 0.0f, 0.0f)*EmissionDir, 100.0f, 0, 0xFF00FF00, "X");
  538. pEditor->Render()->Print(Vector(0.0f, 0.0f, 1.2f)*EmissionDir, 100.0f, 0, 0xFF0000FF, "Z");
  539. }
  540. }
  541. pEditor->Render()->SetProjection(matOldPrj);
  542. cliper.Pop();
  543. if (SaveOKTime > 0)
  544. {
  545. float Alpha = (SaveOKTime / (SAVEDOK_SHOWTIME*2.0f));
  546. Color BackColor(1.0f, 1.0f, 1.0f, 0.5f + Alpha);
  547. Color BlackColor(0.0f, 0.0f, 0.0f, Alpha);
  548. int sLeft = 0;
  549. int sTop = 0;
  550. int sWidth = 300;
  551. int sHeight = 80;
  552. //pEditor->Render()->SetTexture(0, NULL);
  553. //pEditor->Render()->SetTexture(1, NULL);
  554. float sLeftAdd = (pEditor->Render()->GetScreenInfo3D().dwWidth - sWidth) / 2.0f;
  555. float sTopAdd = (pEditor->Render()->GetScreenInfo3D().dwHeight - sHeight) / 2.0f;
  556. sLeft += (int)sLeftAdd;
  557. sTop += (int)sTopAdd;
  558. GUIHelper::Draw2DRectAlpha( sLeft, sTop, sWidth, sHeight, BackColor.GetDword());
  559. GUIHelper::DrawWireRect( sLeft, sTop, sWidth, sHeight, BlackColor.GetDword());
  560. int fntHeight = pFont->GetHeight();
  561. int fntWidth = pFont->GetWidth(SAVEDOK_MESSAGE);
  562. int fntAddWidth = (sWidth - fntWidth) / 2;
  563. int fntAddHeight = (sHeight - fntHeight) / 2;
  564. pFont->Print(sLeft+fntAddWidth, sTop+fntAddHeight, 0x0, SAVEDOK_MESSAGE);
  565. SaveOKTime -= api->GetDeltaTime();
  566. }
  567. //
  568. ParticleManager* pManager = (ParticleManager*)pEditor->Manager();
  569. DWORD SystemCount = pManager->GetCreatedSystemCount();
  570. if (SystemCount > 0)
  571. {
  572. ParticleSystemProxy* pSys = pManager->GetCreatedSystemByIndex(0);
  573. ParticleSystem* pRealSystem = pSys->Lock();
  574. pEditor->Render()->Print(0, 0, 0xFF000000, "%3.2f sec", pRealSystem->GetSystemTime());
  575. pSys->Unlock();
  576. }
  577. }
  578. void TMainWindow::DrawGrid ()
  579. {
  580. if (!bDrawGrid) return;
  581. float StepSize = 1.0f;
  582. int GridSize = 12;
  583. float Edge = StepSize*GridSize;
  584. for (int x = 0; x <= GridSize; x++)
  585. {
  586. float x1 = x * StepSize;
  587. float x2 = -x1;
  588. DWORD clr = pEditor->GetGridColor();
  589. if (x == 0) clr = pEditor->GetGridZeroColor();
  590. pEditor->Render()->DrawLine(Vector (x1, 0, Edge), clr, Vector (x1, 0, -Edge), clr);
  591. pEditor->Render()->DrawLine(Vector (x2, 0, Edge), clr, Vector (x2, 0, -Edge), clr);
  592. }
  593. for (int z = 0; z <= GridSize; z++)
  594. {
  595. float z1 = z * StepSize;
  596. float z2 = -z1;
  597. DWORD clr = pEditor->GetGridColor();
  598. if (z == 0) clr = pEditor->GetGridZeroColor();
  599. pEditor->Render()->DrawLine(Vector (Edge, 0, z1), clr, Vector (-Edge, 0, z1), clr);
  600. pEditor->Render()->DrawLine(Vector (Edge, 0, z2), clr, Vector (-Edge, 0, z2), clr);
  601. }
  602. }
  603. void TMainWindow::MouseMove (int button, const GUIPoint& pt)
  604. {
  605. GUIWindow::MouseMove (button, pt);
  606. }
  607. void TMainWindow::MouseUp (int button, const GUIPoint& pt)
  608. {
  609. GUIWindow::MouseUp (button, pt);
  610. }
  611. bool TMainWindow::ProcessMessages (GUIMessage message, DWORD lparam, DWORD hparam)
  612. {
  613. return GUIWindow::ProcessMessages(message, lparam, hparam);
  614. }
  615. void TMainWindow::BuildBrowserTree ()
  616. {
  617. TreeView1->Items->Clear();
  618. ParticleManager* pManager = (ParticleManager*)pEditor->Manager();
  619. DWORD SystemCount = pManager->GetCreatedSystemCount();
  620. if (SystemCount == 0)
  621. {
  622. ::Application->MessageBox("No particle system available !!!", "Error", GUIMB_OK, true);
  623. return;
  624. }
  625. if (SystemCount > 1)
  626. {
  627. ::Application->MessageBox("To many systems detected !!!", "Developer message", GUIMB_OK, true);
  628. return;
  629. }
  630. ParticleSystemProxy* pS = pManager->GetCreatedSystemByIndex(0);
  631. Assert (pS);
  632. ParticleSystem* pSystem = pS->Lock();
  633. DWORD EmittersCount = pSystem->GetEmittersCount();
  634. for (DWORD n = 0; n < EmittersCount; n++)
  635. {
  636. IEmitter* pEmitter = pSystem->GetEmitterByIndex(n);
  637. GUITreeNode* pTreeNode = NEW GUITreeNode;
  638. pTreeNode->Data = pEmitter;
  639. pTreeNode->Tag = ET_UNKNOWN;
  640. //Назначем уникальный индентификатор
  641. if (pSystem->GetEmitterTypeByIndex(n) == POINT_EMITTER) pTreeNode->Tag = ET_POINT_EMITTER;
  642. __tmp = "#b";
  643. __tmp += pEmitter->GetName ();
  644. pTreeNode->SetText(__tmp.c_str());
  645. pTreeNode->Image->Load("peditor\\emitter");
  646. TreeView1->Items->Add(pTreeNode);
  647. AddFieldListToTree (&pTreeNode->Childs, pEmitter->GetData());
  648. pTreeNode->Childs.Sort (FuncCompare);
  649. DWORD ParticleTypesCount = pEmitter->GetParticleTypesCount();
  650. for (DWORD i = 0; i < ParticleTypesCount; i++)
  651. {
  652. FieldList* pParticleInfo = pEmitter->GetParticleTypeDataByIndex(i);
  653. ParticleType Type = pEmitter->GetParticleTypeByIndex(i);
  654. GUITreeNode* pSubeTreeNode = NEW GUITreeNode;
  655. pSubeTreeNode->Data = pParticleInfo;
  656. //Присваиваем уникальный тип для индентификации
  657. pSubeTreeNode->Tag = ET_UNKNOWN;
  658. if (Type == BILLBOARD_PARTICLE )
  659. {
  660. pSubeTreeNode->Tag = ET_BILLBOARD_PARTICLE;
  661. pSubeTreeNode->Image->Load("peditor\\particle");
  662. }
  663. if (Type == MODEL_PARTICLE )
  664. {
  665. pSubeTreeNode->Tag = ET_MODEL_PARTICLE;
  666. pSubeTreeNode->Image->Load("peditor\\particlem");
  667. }
  668. __tmp = "#b";
  669. __tmp += pParticleInfo->GetString(GUID_PARTICLE_NAME, "Not found");;
  670. pSubeTreeNode->SetText(__tmp);
  671. pTreeNode->Childs.Add(pSubeTreeNode);
  672. AddFieldListToTree (&pSubeTreeNode->Childs, pParticleInfo);
  673. pSubeTreeNode->Childs.Sort (FuncCompare);
  674. }
  675. }
  676. pS->Unlock();
  677. }
  678. void TMainWindow::AddFieldListToTree (GUITreeNodes* Parent, FieldList* pParticleInfo)
  679. {
  680. //api->Trace("--------------------------------------------------------------\n");
  681. DWORD FieldCount = pParticleInfo->_GetFieldCount();
  682. for (DWORD n = 0; n < FieldCount; n++)
  683. {
  684. const FieldList::FieldDesc &Field = pParticleInfo->_GetFieldByIndex(n);
  685. if (Field.Type == FIELD_UNKNOWN) continue;
  686. GUITreeNode* pTreeNode = NEW GUITreeNode;
  687. Parent->Add(pTreeNode);
  688. //api->Trace("param, type = %d, 0x%p", Field.Type, Field.pPointer);
  689. switch (Field.Type)
  690. {
  691. case FIELD_BOOL:
  692. {
  693. DataBool* pBoolField = (DataBool*)Field.pPointer;
  694. //api->Trace("bool, name = '%s'", pBoolField->GetEditorName());
  695. pTreeNode->SetText(pBoolField->GetEditorName());
  696. pTreeNode->Image->Load("peditor\\bool");
  697. pTreeNode->Data = pBoolField;
  698. pTreeNode->Tag = ET_FIELD_BOOL;
  699. break;
  700. }
  701. case FIELD_FLOAT:
  702. {
  703. DataFloat* pFloatField = (DataFloat*)Field.pPointer;
  704. //api->Trace("float, name = '%s'", pFloatField->GetEditorName());
  705. pTreeNode->SetText(pFloatField->GetEditorName());
  706. pTreeNode->Image->Load("peditor\\float");
  707. pTreeNode->Data = pFloatField;
  708. pTreeNode->Tag = ET_FIELD_FLOAT;
  709. break;
  710. }
  711. case FIELD_GRAPH:
  712. {
  713. DataGraph* pGraphField = (DataGraph*)Field.pPointer;
  714. //api->Trace("graph, name = '%s'", pGraphField->GetEditorName());
  715. pTreeNode->SetText(pGraphField->GetEditorName());
  716. pTreeNode->Image->Load("peditor\\graph");
  717. pTreeNode->Data = pGraphField;
  718. pTreeNode->Tag = ET_FIELD_GRAPH;
  719. break;
  720. }
  721. case FIELD_POSITION:
  722. {
  723. DataPosition* pPositionField = (DataPosition*)Field.pPointer;
  724. //api->Trace("position, name = '%s'", pPositionField->GetEditorName());
  725. pTreeNode->SetText(pPositionField->GetEditorName());
  726. pTreeNode->Image->Load("peditor\\pos");
  727. pTreeNode->Data = pPositionField;
  728. pTreeNode->Tag = ET_FIELD_POSITION;
  729. break;
  730. }
  731. case FIELD_STRING:
  732. {
  733. DataString* pStringField = (DataString*)Field.pPointer;
  734. //api->Trace("string, name = '%s'", pStringField->GetEditorName());
  735. pTreeNode->SetText(pStringField->GetEditorName());
  736. if (crt_stricmp (pTreeNode->GetText(), "Name") == 0)
  737. {
  738. pTreeNode->Release();
  739. continue;
  740. }
  741. pTreeNode->Image->Load("peditor\\string");
  742. pTreeNode->Data = pStringField;
  743. pTreeNode->Tag = ET_FIELD_STRING;
  744. break;
  745. }
  746. case FIELD_UV:
  747. {
  748. DataUV* pUVField = (DataUV*)Field.pPointer;
  749. //api->Trace("uv, name = '%s'", pUVField->GetEditorName());
  750. pTreeNode->SetText(pUVField->GetEditorName());
  751. pTreeNode->Image->Load("peditor\\texture");
  752. pTreeNode->Data = pUVField;
  753. pTreeNode->Tag = ET_FIELD_UV;
  754. break;
  755. }
  756. case FIELD_COLOR:
  757. {
  758. DataColor* pColorField = (DataColor*)Field.pPointer;
  759. //api->Trace("color, name = '%s'", pColorField->GetEditorName());
  760. pTreeNode->SetText(pColorField->GetEditorName());
  761. pTreeNode->Image->Load("peditor\\color");
  762. pTreeNode->Data = pColorField;
  763. pTreeNode->Tag = ET_FIELD_COLOR;
  764. break;
  765. }
  766. default:
  767. throw ("Unknown Attribute type");
  768. } //switch
  769. // api->Trace("Node = %s", pTreeNode->Text);
  770. }
  771. }
  772. void _cdecl TMainWindow::ShowHideParticle (GUIControl* sender)
  773. {
  774. GUITreeNode* TNode = TreeView1->GetSelectedNode();
  775. if (!TNode) return;
  776. if (TNode->Tag == ET_POINT_EMITTER)
  777. {
  778. IEmitter* pEmiter = (IEmitter*)TNode->Data;
  779. bool EmitterEnabled = pEmiter->SetEnable(!pEmiter->GetEnable());
  780. if (EmitterEnabled)
  781. BoldBranch (TNode);
  782. else
  783. UnBoldBranch (TNode);
  784. }
  785. if (TNode->Tag == ET_BILLBOARD_PARTICLE || TNode->Tag == ET_MODEL_PARTICLE)
  786. {
  787. IEmitter* pEmiter = (IEmitter*)TNode->Parent->Data;
  788. int Index = pEmiter->GetParticleTypeIndex((FieldList*)TNode->Data);
  789. Assert (Index >= 0);
  790. bool ParticleTypeEnabled = pEmiter->SetParticleTypeEnable(!pEmiter->GetParticleTypeEnable(Index), Index);
  791. if (ParticleTypeEnabled)
  792. BoldBranch (TNode);
  793. else
  794. UnBoldBranch (TNode);
  795. }
  796. }
  797. void TMainWindow::BoldBranch (GUITreeNode* pNode)
  798. {
  799. if ( pNode->Tag == ET_POINT_EMITTER ||
  800. pNode->Tag == ET_BILLBOARD_PARTICLE ||
  801. pNode->Tag == ET_MODEL_PARTICLE )
  802. {
  803. if (pNode->GetText()[DWORD(0)] != '#' && pNode->GetText()[DWORD(1)] != 'b')
  804. {
  805. __tmp = string("#b") + pNode->GetText();
  806. pNode->SetText(__tmp);
  807. }
  808. for (int n = 0; n < pNode->Childs.GetCount(); n++)
  809. {
  810. BoldBranch (pNode->Childs[n]);
  811. }
  812. }
  813. }
  814. void TMainWindow::UnBoldBranch (GUITreeNode* pNode)
  815. {
  816. if ( pNode->Tag == ET_POINT_EMITTER ||
  817. pNode->Tag == ET_BILLBOARD_PARTICLE ||
  818. pNode->Tag == ET_MODEL_PARTICLE )
  819. {
  820. if (pNode->GetText()[DWORD(0)] == '#' && pNode->GetText()[DWORD(1)] == 'b')
  821. {
  822. __tmp = pNode->GetText();
  823. __tmp.Delete(0, 2) ;
  824. pNode->SetText(__tmp);
  825. }
  826. for (int n = 0; n < pNode->Childs.GetCount(); n++)
  827. {
  828. UnBoldBranch (pNode->Childs[n]);
  829. }
  830. }
  831. }
  832. void _cdecl TMainWindow::TreeViewChangeNode (GUIControl* sender)
  833. {
  834. GUITreeNode* SelNode = TreeView1->GetSelectedNode();
  835. if (!SelNode) return;
  836. if (SelNode->bReadOnly)
  837. {
  838. return;
  839. }
  840. if (NowEdited)
  841. {
  842. ApplyChangeSystem ();
  843. NowEdited->EndEdit();
  844. NowEdited->Release ();
  845. NowEdited = NULL;
  846. }
  847. if (SelNode->Tag == ET_FIELD_GRAPH)
  848. {
  849. GraphEditor* pNewGraphEdit = NEW GraphEditor ();
  850. pNewGraphEdit->BeginEdit(Panel1, (DataGraph*)SelNode->Data);
  851. NowEdited = pNewGraphEdit;
  852. if (!UndoSelectNode) CreateUndo (false);
  853. }
  854. if (SelNode->Tag == ET_FIELD_UV)
  855. {
  856. UVEditor* pNewUVEdit = NEW UVEditor ();
  857. pNewUVEdit->BeginEdit(Panel1, (DataUV*)SelNode->Data);
  858. NowEdited = pNewUVEdit;
  859. if (!UndoSelectNode) CreateUndo (false);
  860. }
  861. if (SelNode->Tag == ET_FIELD_COLOR)
  862. {
  863. ColorEditor* pNewColorEdit = NEW ColorEditor ();
  864. pNewColorEdit->BeginEdit(Panel1, (DataColor*)SelNode->Data);
  865. NowEdited = pNewColorEdit;
  866. if (!UndoSelectNode) CreateUndo (false);
  867. }
  868. if (SelNode->Tag == ET_FIELD_BOOL)
  869. {
  870. BoolEditor* pNewBoolEdit = NEW BoolEditor ();
  871. pNewBoolEdit->BeginEdit(Panel1, (DataBool*)SelNode->Data);
  872. NowEdited = pNewBoolEdit;
  873. if (!UndoSelectNode) CreateUndo (false);
  874. }
  875. if (SelNode->Tag == ET_FIELD_FLOAT)
  876. {
  877. FloatEditor* pNewFloatEdit = NEW FloatEditor ();
  878. pNewFloatEdit->BeginEdit(Panel1, (DataFloat*)SelNode->Data);
  879. NowEdited = pNewFloatEdit;
  880. if (!UndoSelectNode) CreateUndo (false);
  881. }
  882. if (SelNode->Tag == ET_FIELD_POSITION)
  883. {
  884. PositionEditor* pNewPositionEdit = NEW PositionEditor ();
  885. pNewPositionEdit->BeginEdit(Panel1, (DataPosition*)SelNode->Data);
  886. NowEdited = pNewPositionEdit;
  887. if (!UndoSelectNode) CreateUndo (false);
  888. }
  889. if (SelNode->Tag == ET_FIELD_STRING)
  890. {
  891. StringEditor* pNewStringEdit = NEW StringEditor ();
  892. pNewStringEdit->BeginEdit(Panel1, (DataString*)SelNode->Data);
  893. NowEdited = pNewStringEdit;
  894. if (!UndoSelectNode) CreateUndo (false);
  895. }
  896. }
  897. void _cdecl TMainWindow::RenameObjectPressed (GUIControl* sender)
  898. {
  899. //api->Trace("Rename pressed\n");
  900. GUITreeNode* SelNode = TreeView1->GetSelectedNode();
  901. if (!SelNode)
  902. {
  903. //api->Trace("Node not selected\n");
  904. return;
  905. }
  906. if ( SelNode->Tag == ET_POINT_EMITTER)
  907. {
  908. //api->Trace("Point emitter\n");
  909. IEmitter* pEmitter = (IEmitter*)SelNode->Data;
  910. TRenameWindow* pRenamer = NEW TRenameWindow(pEmitter->GetName());
  911. Application->ShowModal(pRenamer);
  912. pRenamer->OnClose = (CONTROL_EVENT)&TMainWindow::EmitterRename;
  913. }
  914. if ( SelNode->Tag == ET_BILLBOARD_PARTICLE || SelNode->Tag == ET_MODEL_PARTICLE )
  915. {
  916. //api->Trace("Particle\n");
  917. FieldList* pParticle = (FieldList*)SelNode->Data;
  918. TRenameWindow* pRenamer = NEW TRenameWindow(pParticle->GetString(GUID_PARTICLE_NAME, "Not found"));
  919. Application->ShowModal(pRenamer);
  920. pRenamer->OnClose = (CONTROL_EVENT)&TMainWindow::ParticleRename;
  921. }
  922. }
  923. void _cdecl TMainWindow::EmitterRename (GUIControl* sender)
  924. {
  925. TRenameWindow* pRenamer = (TRenameWindow*)sender;
  926. if (!pRenamer->ExitByOK) return;
  927. GUITreeNode* SelNode = TreeView1->GetSelectedNode();
  928. if (!SelNode) return;
  929. if ( SelNode->Tag != ET_POINT_EMITTER) return;
  930. IEmitter* pEmitter = (IEmitter*)SelNode->Data;
  931. pEmitter->SetName(pRenamer->pText->Text.GetBuffer());
  932. SelNode->SetText(pRenamer->pText->Text);
  933. if (pEmitter->GetEnable()) BoldBranch (SelNode);
  934. CreateUndo ();
  935. }
  936. void _cdecl TMainWindow::ParticleRename (GUIControl* sender)
  937. {
  938. TRenameWindow* pRenamer = (TRenameWindow*)sender;
  939. if (!pRenamer->ExitByOK) return;
  940. GUITreeNode* SelNode = TreeView1->GetSelectedNode();
  941. if (!SelNode) return;
  942. if ( SelNode->Tag != ET_BILLBOARD_PARTICLE && SelNode->Tag != ET_MODEL_PARTICLE) return;
  943. FieldList* pParticle = (FieldList*)SelNode->Data;
  944. DataString* pName = pParticle->FindStringByGUID(GUID_PARTICLE_NAME);
  945. pName->SetValue(pRenamer->pText->Text.GetBuffer());
  946. SelNode->SetText(pRenamer->pText->Text);
  947. IEmitter* pEmiter = (IEmitter*)SelNode->Parent->Data;
  948. int Index = pEmiter->GetParticleTypeIndex(pParticle);
  949. Assert (Index >= 0);
  950. if (pEmiter->GetParticleTypeEnable(Index))
  951. {
  952. BoldBranch (SelNode);
  953. }
  954. CreateUndo ();
  955. }
  956. void _cdecl TMainWindow::SavePressed (GUIControl* sender)
  957. {
  958. //SaveAsPressed
  959. ParticleManager* pManager = (ParticleManager*)pEditor->Manager();
  960. DWORD SystemCount = pManager->GetCreatedSystemCount();
  961. bool bNeedSaveAS = false;
  962. for (DWORD n = 0; n < SystemCount; n++)
  963. {
  964. ParticleSystemProxy* pSys = pManager->GetCreatedSystemByIndex(n);
  965. string pSysName = pSys->GetName();
  966. if (pSysName == "_empty.xps" || pSysName == "_empty.xml")
  967. {
  968. bNeedSaveAS = true;
  969. }
  970. }
  971. if (bNeedSaveAS)
  972. {
  973. SaveAsPressed(sender);
  974. }
  975. for (DWORD n = 0; n < SystemCount; n++)
  976. {
  977. ParticleSystemProxy* pSys = pManager->GetCreatedSystemByIndex(n);
  978. const char* pSysName = pSys->GetName();
  979. pManager->WriteSystemCache(pSysName);
  980. }
  981. ClearUndoSystem ();
  982. SaveOKTime = SAVEDOK_SHOWTIME;
  983. }
  984. void _cdecl TMainWindow::UndoPressed (GUIControl* sender)
  985. {
  986. bLowFPS = !bLowFPS;
  987. /*
  988. if (NowEdited)
  989. {
  990. ApplyChangeSystem (false);
  991. NowEdited->EndEdit();
  992. NowEdited->Release ();
  993. NowEdited = NULL;
  994. }
  995. Undo ();
  996. */
  997. }
  998. void _cdecl TMainWindow::RedoPressed (GUIControl* sender)
  999. {
  1000. if (NowEdited)
  1001. {
  1002. ApplyChangeSystem (false);
  1003. NowEdited->EndEdit();
  1004. NowEdited->Release ();
  1005. NowEdited = NULL;
  1006. }
  1007. Redo ();
  1008. }
  1009. //============================ undo =====================================
  1010. void TMainWindow::InitUndoSystem(DWORD UndoSteps)
  1011. {
  1012. ShutdownUndoSystem ();
  1013. PositionInUndoBuffer = -1;
  1014. MaxUndoPos = UndoSteps;
  1015. }
  1016. void TMainWindow::Undo ()
  1017. {
  1018. return;
  1019. if (PositionInUndoBuffer <= 0) return;
  1020. IParticleSystem* pSystem = pEditor->GetSystem();
  1021. if (!pSystem) return;
  1022. const char* SystemName = pSystem->GetName();
  1023. if (NowEdited)
  1024. {
  1025. NowEdited->EndEdit();
  1026. NowEdited->Release ();
  1027. NowEdited = NULL;
  1028. }
  1029. PositionInUndoBuffer--;
  1030. SetUndoButtonsState ();
  1031. MemFile* pUndoMem = UndoEntry[PositionInUndoBuffer];
  1032. pUndoMem->Seek(0, VFSEEK_SET);
  1033. ((ParticleManager*)pEditor->Manager())->LoadSystemCache(SystemName, pUndoMem);
  1034. //pEditor->Manager()->Editor_UpdateCachedData();
  1035. BuildBrowserTree ();
  1036. RestoreTreeExpansion(pUndoMem);
  1037. }
  1038. void TMainWindow::SetUndoButtonsState ()
  1039. {
  1040. /*
  1041. if (PositionInUndoBuffer <= 0)
  1042. btnUndoAction->bEnabled = false;
  1043. else
  1044. btnUndoAction->bEnabled = true;
  1045. */
  1046. /*
  1047. if (PositionInUndoBuffer >= (int)(UndoEntry.Size()-1))
  1048. btnRedoAction->bEnabled = false;
  1049. else
  1050. btnRedoAction->bEnabled = true;
  1051. */
  1052. }
  1053. void TMainWindow::Redo ()
  1054. {
  1055. return;
  1056. if (PositionInUndoBuffer >= (int)(UndoEntry.Size()-1)) return;
  1057. IParticleSystem* pSystem = pEditor->GetSystem();;
  1058. if (!pSystem) return;
  1059. const char* SystemName = pSystem->GetName();
  1060. if (NowEdited)
  1061. {
  1062. NowEdited->EndEdit();
  1063. NowEdited->Release ();
  1064. NowEdited = NULL;
  1065. }
  1066. PositionInUndoBuffer++;
  1067. SetUndoButtonsState ();
  1068. MemFile* pUndoMem = UndoEntry[PositionInUndoBuffer];
  1069. pUndoMem->Seek(0, VFSEEK_SET);
  1070. ((ParticleManager*)pEditor->Manager())->LoadSystemCache(SystemName, pUndoMem);
  1071. //pEditor->Manager()->Editor_UpdateCachedData();
  1072. BuildBrowserTree ();
  1073. RestoreTreeExpansion(pUndoMem);
  1074. }
  1075. void TMainWindow::CreateUndo (bool KillSameUndos)
  1076. {
  1077. //bug HERE !!!
  1078. return;
  1079. //api->Trace("============ undo ==================");
  1080. IParticleSystem* pSystem = pEditor->GetSystem();;
  1081. if (!pSystem) return;
  1082. const char* SystemName = pSystem->GetName();
  1083. //Redo больше невозможно становиться...
  1084. if (PositionInUndoBuffer < (int)(UndoEntry.Size()-1))
  1085. {
  1086. for (DWORD i = PositionInUndoBuffer+1; i < UndoEntry.Size(); i++)
  1087. {
  1088. delete UndoEntry[i];
  1089. }
  1090. UndoEntry.DelRange(PositionInUndoBuffer+1, UndoEntry.Size()-1);
  1091. }
  1092. SetUndoButtonsState ();
  1093. //Создаем UNDO
  1094. MemFile* pUndoMem = NEW MemFile;
  1095. pUndoMem->OpenWrite(300000);
  1096. DWORD Index1 = UndoEntry.Add(pUndoMem);
  1097. ((ParticleManager*)pEditor->Manager())->WriteSystemCache(SystemName, pUndoMem);
  1098. SaveTreeExpansion(pUndoMem);
  1099. PositionInUndoBuffer++;
  1100. DWORD Index2 = Index1-1;
  1101. if (Index1 > 0 && KillSameUndos)
  1102. {
  1103. //Если ничего не поменялось...
  1104. if (UndoEntry[Index1]->Compare(UndoEntry[Index2]) == true)
  1105. {
  1106. //api->Trace("============ cancel create undo operation ==================");
  1107. delete UndoEntry[Index1];
  1108. UndoEntry.Extract(Index1);
  1109. PositionInUndoBuffer--;
  1110. }
  1111. }
  1112. //api->Trace("undo count %d", UndoEntry.Size());
  1113. SetUndoButtonsState ();
  1114. //Если UNDO слишком большой подрезаем его...
  1115. if (UndoEntry.Size() > MaxUndoPos)
  1116. {
  1117. delete UndoEntry[0];
  1118. UndoEntry.Extract(0);
  1119. PositionInUndoBuffer--;
  1120. }
  1121. //if (PositionInUndoBuffer > 0) btnUndoAction->bEnabled = true;
  1122. }
  1123. void TMainWindow::ShutdownUndoSystem ()
  1124. {
  1125. for (DWORD n = 0; n < UndoEntry.Size(); n++)
  1126. {
  1127. delete UndoEntry[n];
  1128. }
  1129. UndoEntry.DelAll();
  1130. }
  1131. void TMainWindow::ClearUndoSystem ()
  1132. {
  1133. ShutdownUndoSystem ();
  1134. InitUndoSystem (MaxUndoPos);
  1135. }
  1136. //============================ undo =====================================
  1137. void TMainWindow::ApplyChangeSystem (bool NeedCreateUndo)
  1138. {
  1139. if (NowEdited)
  1140. {
  1141. NowEdited->Apply();
  1142. pEditor->Manager()->Editor_UpdateCachedData();
  1143. if (NeedCreateUndo) CreateUndo ();
  1144. }
  1145. }
  1146. void TMainWindow::SaveTreeExpansion (MemFile* pFile)
  1147. {
  1148. GUITreeNode* pCurSelNode = TreeView1->GetSelectedNode();
  1149. DWORD RootConut = TreeView1->Items->GetCount();
  1150. pFile->WriteType(RootConut);
  1151. for (DWORD n =0; n < RootConut; n++)
  1152. {
  1153. GUITreeNode* pNode = TreeView1->Items->Get(n);
  1154. BYTE ExpValue = pNode->Expanded;
  1155. pFile->WriteType(ExpValue);
  1156. DWORD ChildsCount = pNode->Childs.GetCount();
  1157. pFile->WriteType(ChildsCount);
  1158. for (DWORD i = 0; i < ChildsCount; i++)
  1159. {
  1160. GUITreeNode* pSubNode = pNode->Childs.Get(i);
  1161. BYTE ExpSubValue = pSubNode->Expanded;
  1162. pFile->WriteType(ExpSubValue);
  1163. DWORD AttrCount = pSubNode->Childs.GetCount();
  1164. pFile->WriteType(AttrCount);
  1165. for (DWORD j = 0; j < AttrCount; j++)
  1166. {
  1167. GUITreeNode* pAttrNode = pSubNode->Childs.Get(j);
  1168. BYTE ExpAttrSel = pAttrNode->Selected;
  1169. pFile->WriteType(ExpAttrSel);
  1170. }
  1171. }
  1172. }
  1173. }
  1174. void TMainWindow::RestoreTreeExpansion (MemFile* pFile)
  1175. {
  1176. GUITreeNode* pSelectedNode = NULL;
  1177. DWORD RootConut;
  1178. pFile->ReadType(RootConut);
  1179. for (DWORD n =0; n < RootConut; n++)
  1180. {
  1181. BYTE ExpValue;
  1182. pFile->ReadType(ExpValue);
  1183. GUITreeNode* pNode = TreeView1->Items->Get(n);
  1184. pNode->Expanded = (ExpValue != 0);
  1185. DWORD ChildsCount;
  1186. pFile->ReadType(ChildsCount);
  1187. for (DWORD i = 0; i < ChildsCount; i++)
  1188. {
  1189. BYTE ExpSubValue;
  1190. pFile->ReadType(ExpSubValue);
  1191. GUITreeNode* pSubNode = pNode->Childs.Get(i);
  1192. pSubNode->Expanded = (ExpSubValue != 0);
  1193. DWORD AttrCount;
  1194. pFile->ReadType(AttrCount);
  1195. for (DWORD j = 0; j < AttrCount; j++)
  1196. {
  1197. BYTE ExpAttrSel;
  1198. pFile->ReadType(ExpAttrSel);
  1199. GUITreeNode* pAttrNode = pSubNode->Childs.Get(j);
  1200. if (ExpAttrSel != 0)
  1201. {
  1202. pSelectedNode = pAttrNode;
  1203. }
  1204. }
  1205. }
  1206. }
  1207. if (pSelectedNode)
  1208. {
  1209. UndoSelectNode = true;
  1210. TreeView1->SetSelectedNode(pSelectedNode, false);
  1211. UndoSelectNode = false;
  1212. }
  1213. }
  1214. void _cdecl TMainWindow::CreatePointEmitterPressed (GUIControl* sender)
  1215. {
  1216. IParticleSystem* pSys = pEditor->GetSystem();
  1217. if (!pSys) return;
  1218. const char* pSystemName = pSys->GetName();
  1219. ParticleManager* pManager = (ParticleManager*)pEditor->Manager();
  1220. if (!pManager) return;
  1221. TempSystemName = pSystemName;
  1222. /*
  1223. pManager->Editor_CreatePointEmitter (pSystemName);
  1224. CreateUndo ();
  1225. BuildBrowserTree ();
  1226. */
  1227. TChooseWindow* pNewChooseName = NEW TChooseWindow("PointEmitter");
  1228. pNewChooseName->pDesc->Caption = "Type new emitter name";
  1229. pNewChooseName->OnClose = (CONTROL_EVENT)&TMainWindow::RealCreatePointEmitter;
  1230. Application->ShowModal(pNewChooseName);
  1231. }
  1232. void _cdecl TMainWindow::CreateBillboardPressed (GUIControl* sender)
  1233. {
  1234. IParticleSystem* pSys = pEditor->GetSystem();
  1235. if (!pSys) return;
  1236. const char* pSystemName = pSys->GetName();
  1237. ParticleManager* pManager = (ParticleManager*)pEditor->Manager();
  1238. if (!pManager) return;
  1239. GUITreeNode* pTreeNode = TreeView1->GetSelectedNode();
  1240. if (!pTreeNode)
  1241. {
  1242. Application->MessageBox("Select emitter first !", "Error", GUIMB_OK);
  1243. return;
  1244. }
  1245. if (pTreeNode->Tag != ET_POINT_EMITTER)
  1246. {
  1247. Application->MessageBox("Select emitter first !", "Error", GUIMB_OK);
  1248. return;
  1249. }
  1250. const char* EmitterName = NULL;
  1251. if (pTreeNode->GetText()[0] == '#')
  1252. EmitterName = pTreeNode->GetText() + 2;
  1253. else
  1254. EmitterName = pTreeNode->GetText();
  1255. TempSystemName = pSystemName;
  1256. TempEmitterName = EmitterName;
  1257. TempNodeToAdd = pTreeNode;
  1258. /*
  1259. pManager->Editor_CreateBillBoardParticle (pSystemName, EmitterName);
  1260. CreateUndo ();
  1261. BuildBrowserTree ();
  1262. */
  1263. TChooseWindow* pNewChooseName = NEW TChooseWindow("Billboard");
  1264. pNewChooseName->pDesc->Caption = "Type new particle name";
  1265. pNewChooseName->OnClose = (CONTROL_EVENT)&TMainWindow::RealCreateBillboard;
  1266. Application->ShowModal(pNewChooseName);
  1267. }
  1268. void _cdecl TMainWindow::CreateModelPressed (GUIControl* sender)
  1269. {
  1270. IParticleSystem* pSys = pEditor->GetSystem();
  1271. if (!pSys) return;
  1272. const char* pSystemName = pSys->GetName();
  1273. ParticleManager* pManager = (ParticleManager*)pEditor->Manager();
  1274. if (!pManager) return;
  1275. GUITreeNode* pTreeNode = TreeView1->GetSelectedNode();
  1276. if (!pTreeNode)
  1277. {
  1278. Application->MessageBox("Select emitter first !", "Error", GUIMB_OK);
  1279. return;
  1280. }
  1281. if (pTreeNode->Tag != ET_POINT_EMITTER)
  1282. {
  1283. Application->MessageBox("Select emitter first !", "Error", GUIMB_OK);
  1284. return;
  1285. }
  1286. const char* EmitterName = NULL;
  1287. if (pTreeNode->GetText()[0] == '#')
  1288. EmitterName = pTreeNode->GetText() + 2;
  1289. else
  1290. EmitterName = pTreeNode->GetText();
  1291. TempSystemName = pSystemName;
  1292. TempEmitterName = EmitterName;
  1293. TempNodeToAdd = pTreeNode;
  1294. /*
  1295. pManager->Editor_CreateModelParticle (pSystemName, EmitterName);
  1296. CreateUndo ();
  1297. BuildBrowserTree ();
  1298. */
  1299. TChooseWindow* pNewChooseName = NEW TChooseWindow("Model");
  1300. pNewChooseName->pDesc->Caption = "Type new particle name";
  1301. pNewChooseName->OnClose = (CONTROL_EVENT)&TMainWindow::RealCreateModel;
  1302. Application->ShowModal(pNewChooseName);
  1303. }
  1304. void _cdecl TMainWindow::RealCreatePointEmitter (GUIControl* sender)
  1305. {
  1306. TChooseWindow* pNewChooseName = (TChooseWindow*)sender;
  1307. if (!pNewChooseName->ExitByOK) return;
  1308. ParticleManager* pManager = (ParticleManager*)pEditor->Manager();
  1309. FieldList* pData = pManager->Editor_CreatePointEmitter (TempSystemName.GetBuffer(), pNewChooseName->pText->Text.GetBuffer());
  1310. ParticleSystemProxy* pSys = (ParticleSystemProxy*)pEditor->GetSystem();
  1311. ParticleSystem* realPS = pSys->Lock();
  1312. IEmitter* pEmitter = realPS->FindEmitterByData(pData);
  1313. pSys->Unlock();
  1314. Assert (pEmitter);
  1315. /*
  1316. GUITreeNode* pTreeNode = NEW GUITreeNode;
  1317. pTreeNode->Data = pEmitter;
  1318. pTreeNode->Tag = ET_POINT_EMITTER;
  1319. pTreeNode->Text = "#b";
  1320. pTreeNode->Text += pEmitter->GetName ();
  1321. pTreeNode->Image->Load("peditor\\emitter");
  1322. TreeView1->Items->Add(pTreeNode);
  1323. AddFieldListToTree (&pTreeNode->Childs, pEmitter->GetData());
  1324. pTreeNode->Childs.Sort (FuncCompare);
  1325. */
  1326. BuildBrowserTree ();
  1327. CreateUndo ();
  1328. }
  1329. void _cdecl TMainWindow::RealCreateBillboard (GUIControl* sender)
  1330. {
  1331. TChooseWindow* pNewChooseName = (TChooseWindow*)sender;
  1332. if (!pNewChooseName->ExitByOK) return;
  1333. ParticleManager* pManager = (ParticleManager*)pEditor->Manager();
  1334. FieldList* pParticleInfo = pManager->Editor_CreateBillBoardParticle (TempSystemName.GetBuffer(), TempEmitterName.GetBuffer(), pNewChooseName->pText->Text.GetBuffer());
  1335. /*
  1336. GUITreeNode* pSubeTreeNode = NEW GUITreeNode;
  1337. pSubeTreeNode->Data = pParticleInfo;
  1338. pSubeTreeNode->Tag = ET_BILLBOARD_PARTICLE;
  1339. pSubeTreeNode->Image->Load("peditor\\particle");
  1340. pSubeTreeNode->Text = "#b";
  1341. pSubeTreeNode->Text += pParticleInfo->GetString(PARTICLE_NAME, "Not found");
  1342. TempNodeToAdd->Childs.Add(pSubeTreeNode);
  1343. AddFieldListToTree (&pSubeTreeNode->Childs, pParticleInfo);
  1344. pSubeTreeNode->Childs.Sort (FuncCompare);
  1345. */
  1346. BuildBrowserTree ();
  1347. CreateUndo ();
  1348. }
  1349. void _cdecl TMainWindow::RealCreateModel (GUIControl* sender)
  1350. {
  1351. TChooseWindow* pNewChooseName = (TChooseWindow*)sender;
  1352. if (!pNewChooseName->ExitByOK) return;
  1353. ParticleManager* pManager = (ParticleManager*)pEditor->Manager();
  1354. FieldList* pParticleInfo = pManager->Editor_CreateModelParticle (TempSystemName.GetBuffer(), TempEmitterName.GetBuffer(), pNewChooseName->pText->Text.GetBuffer());
  1355. /*
  1356. GUITreeNode* pSubeTreeNode = NEW GUITreeNode;
  1357. pSubeTreeNode->Data = pParticleInfo;
  1358. pSubeTreeNode->Tag = ET_MODEL_PARTICLE;
  1359. pSubeTreeNode->Image->Load("peditor\\particlem");
  1360. pSubeTreeNode->Text = "#b";
  1361. pSubeTreeNode->Text += pParticleInfo->GetString(PARTICLE_NAME, "Not found");
  1362. TempNodeToAdd->Childs.Add(pSubeTreeNode);
  1363. AddFieldListToTree (&pSubeTreeNode->Childs, pParticleInfo);
  1364. pSubeTreeNode->Childs.Sort (FuncCompare);
  1365. */
  1366. BuildBrowserTree ();
  1367. CreateUndo ();
  1368. }
  1369. void _cdecl TMainWindow::RestartSystem (GUIControl* sender)
  1370. {
  1371. ApplyChangeSystem ();
  1372. IParticleSystem* pSys = pEditor->GetSystem ();
  1373. if (pSys) pSys->Restart(rand());
  1374. }
  1375. void _cdecl TMainWindow::DeleteObjectPressed (GUIControl* sender)
  1376. {
  1377. GUITreeNode* pTreeNode = TreeView1->GetSelectedNode();
  1378. if (!pTreeNode) return;
  1379. ParticleManager* pManager = (ParticleManager*)pEditor->Manager();
  1380. IParticleSystem* pSys = pEditor->GetSystem();
  1381. if (!pSys) return;
  1382. const char* pSystemName = pSys->GetName();
  1383. if (pTreeNode->Tag == ET_POINT_EMITTER)
  1384. {
  1385. // EmitterName
  1386. pManager->DeletePointEmitter (pSystemName, (IEmitter*)pTreeNode->Data);
  1387. BuildBrowserTree ();
  1388. //pTreeNode->Release();
  1389. CreateUndo ();
  1390. }
  1391. if (pTreeNode->Tag == ET_BILLBOARD_PARTICLE)
  1392. {
  1393. pManager->DeleteBillboard (pSystemName, (IEmitter*)pTreeNode->Parent->Data, (FieldList*)pTreeNode->Data);
  1394. BuildBrowserTree ();
  1395. //pTreeNode->Release();
  1396. CreateUndo ();
  1397. }
  1398. if (pTreeNode->Tag == ET_MODEL_PARTICLE)
  1399. {
  1400. pManager->DeleteModel (pSystemName, (IEmitter*)pTreeNode->Parent->Data, (FieldList*)pTreeNode->Data);
  1401. BuildBrowserTree ();
  1402. //pTreeNode->Release();
  1403. CreateUndo ();
  1404. }
  1405. }
  1406. void _cdecl TMainWindow::OpenNewSystemPressed (GUIControl* sender)
  1407. {
  1408. GUIFileOpen* open_dialog = NEW GUIFileOpen ();
  1409. #ifdef USE_XML_FILE_FORMAT
  1410. open_dialog->Filters.Add(".xml");
  1411. open_dialog->FiltersDesc.Add("eXtended Particle System (XML)");
  1412. #else
  1413. open_dialog->Filters.Add(".xps");
  1414. open_dialog->FiltersDesc.Add("eXtended Particle System");
  1415. #endif
  1416. open_dialog->OnOK = (CONTROL_EVENT)&TMainWindow::RealLoadSystem;
  1417. open_dialog->StartDirectory = string(string (pEditor->GetStartDir()) + "\\resource\\particles\\").GetBuffer();
  1418. Application->ShowModal(open_dialog);
  1419. open_dialog->Filter->SelectItem (1);
  1420. /*
  1421. if (NowEdited)
  1422. {
  1423. NowEdited->EndEdit();
  1424. NowEdited->Release ();
  1425. NowEdited = NULL;
  1426. }
  1427. TProjectBrowser* FirstSelector = NEW TProjectBrowser;
  1428. Application->ShowModal(FirstSelector);
  1429. FirstSelector->OnClose = (CONTROL_EVENT)OnCloseManager;
  1430. */
  1431. }
  1432. void _cdecl TMainWindow::RealLoadSystem (GUIControl* sender)
  1433. {
  1434. GUIFileOpen* dialog = (GUIFileOpen*)sender;
  1435. string file;
  1436. file.GetFileTitle(dialog->FileName);
  1437. file.AddExtention(".xps");
  1438. LoadToEditor(file);
  1439. }
  1440. void _cdecl TMainWindow::OnCloseManager (GUIControl* sender)
  1441. {
  1442. Assert(false);
  1443. /*
  1444. TProjectBrowser* FirstSelector = (TProjectBrowser*)sender;
  1445. if (!FirstSelector->UserSelectSystemToOpen) return;
  1446. pEditor->Manager()->OpenProject(FirstSelector->CurrentProjectNameShort.GetBuffer());
  1447. IParticleSystem* pSys = (IParticleSystem*)pEditor->GetSystem ();
  1448. if (pSys)
  1449. {
  1450. pSys->Release ();
  1451. pSys = NULL;
  1452. }
  1453. IParticleSystem* pSYS = pEditor->Manager()->CreateParticleSystemEx(FirstSelector->CurrentSystemName.GetBuffer(), _FL_);
  1454. if (!pSYS) throw ("Can't create system !!!!!");
  1455. ClearUndoSystem();
  1456. BuildBrowserTree ();
  1457. CreateUndo ();
  1458. */
  1459. }
  1460. void _cdecl TMainWindow::OnCreateNewSystem (GUIControl* sender)
  1461. {
  1462. char EmptyFile[12];
  1463. memset (EmptyFile, 0, 12);
  1464. crt_strcpy (EmptyFile, 9, "PSYSv3.5");
  1465. pEditor->Files()->SaveData(".\\resource\\particles\\_empty.xps", EmptyFile, 12);
  1466. ParticleManager* pParticleManager = (ParticleManager*)pEditor->Manager();
  1467. LoadToEditor("_empty");
  1468. //IParticleSystem* pLoadedSys = pParticleManager->CreateParticleSystemEx("_empty.xps", _FL_);
  1469. /*
  1470. TChooseWindow* pNewChooseName = NEW TChooseWindow("New Particle System");
  1471. pNewChooseName->pDesc->Caption = "Type system name";
  1472. pNewChooseName->OnClose = (CONTROL_EVENT)OnCreateNewSystemReal;
  1473. Application->ShowModal(pNewChooseName);
  1474. */
  1475. }
  1476. void _cdecl TMainWindow::OnCreateNewSystemReal (GUIControl* sender)
  1477. {
  1478. TChooseWindow* pNewChooseName = (TChooseWindow*)sender;
  1479. if (!pNewChooseName->ExitByOK) return;
  1480. const char* NewSystemName = pNewChooseName->pText->Text.GetBuffer();
  1481. TempLongFileName = "resource\\particles\\";
  1482. TempLongFileName+=NewSystemName;
  1483. TempLongFileName.AddExtention(".xps");
  1484. if (pEditor->Files()->IsExist(TempLongFileName.GetBuffer()))
  1485. {
  1486. string Mess;
  1487. Mess.Format("File '%s' already exist\nReplace ?", TempLongFileName.GetBuffer());
  1488. GUIMessageBox* pMB = Application->MessageBox(Mess.GetBuffer(), "File exist", GUIMB_OKCANCEL);
  1489. pMB->OnOK = (CONTROL_EVENT)&TMainWindow::RealCreateEmptySystem;
  1490. return;
  1491. }
  1492. RealCreateEmptySystem (NULL);
  1493. }
  1494. void _cdecl TMainWindow::RealCreateEmptySystem (GUIControl* sender)
  1495. {
  1496. /*
  1497. char EmptyFile[12];
  1498. memset (EmptyFile, 0, 12);
  1499. strcpy (EmptyFile, "PSYSv3.5");
  1500. IWrite* pFile = pEditor->Files()->Write(TempLongFileName.GetBuffer(), iw_create_always, _FL_);
  1501. pFile->Write(EmptyFile, 12);
  1502. pFile->Release();
  1503. ParticleManager* pManager = (ParticleManager*)pEditor->Manager();
  1504. string Mess;
  1505. Mess.Format("Add system '%s'\nto current project '%s' and load it ?", TempLongFileName.GetBuffer(), "FIXME!");
  1506. GUIMessageBox* pMB = Application->MessageBox(Mess.GetBuffer(), "Question", GUIMB_OKCANCEL);
  1507. pMB->OnOK = (CONTROL_EVENT)AddToCurrentProject;
  1508. */
  1509. }
  1510. void TMainWindow::LoadToEditor (const char* pSysName)
  1511. {
  1512. if (NowEdited)
  1513. {
  1514. NowEdited->EndEdit();
  1515. NowEdited->Release ();
  1516. NowEdited = NULL;
  1517. }
  1518. ParticleManager* pManager = (ParticleManager*)pEditor->Manager();
  1519. /*
  1520. string LongProjectFileName = "resource\\particles\\";
  1521. LongProjectFileName += "FIXME!";//pManager->GetProjectFileName();
  1522. LongProjectFileName.AddExtention(".prj");
  1523. IIniFile* IniFile = pEditor->Files()->OpenIniFile(LongProjectFileName.GetBuffer(), _FL_);
  1524. Assert (IniFile);
  1525. bool NeedAddToProject = true;
  1526. //Загружаем данные
  1527. string Section;
  1528. for (int n = 0; n < 9999; n++)
  1529. {
  1530. Section.Format("System_%04d", n);
  1531. const char* szManager = IniFile->GetString("Manager", Section.GetBuffer(), NULL);
  1532. if (szManager == NULL) break;
  1533. if (crt_stricmp (szManager, pSysName) == 0)
  1534. {
  1535. NeedAddToProject = false;
  1536. break;
  1537. }
  1538. }
  1539. if (NeedAddToProject)
  1540. {
  1541. IniFile->SetString("Manager", (char*)Section.GetBuffer(), (char*)pSysName);
  1542. }
  1543. IniFile->Release();
  1544. //========= load system.....
  1545. Assert(false);
  1546. //pEditor->Manager()->OpenProject(pManager->GetProjectFileName());
  1547. */
  1548. IParticleSystem* pSys = (IParticleSystem*)pEditor->GetSystem ();
  1549. if (pSys)
  1550. {
  1551. pSys->Release ();
  1552. pSys = NULL;
  1553. }
  1554. ((ParticleManager*)pEditor->Manager())->LoadAllSystems();
  1555. pEditor->Manager()->CreateParticleSystemEx(pSysName, _FL_);
  1556. ClearUndoSystem();
  1557. BuildBrowserTree ();
  1558. CreateUndo ();
  1559. }
  1560. void _cdecl TMainWindow::SaveAsPressed (GUIControl* sender)
  1561. {
  1562. GUIFileSave* save_dialog = NEW GUIFileSave ();
  1563. save_dialog->Filters.Add(".xps");
  1564. save_dialog->FiltersDesc.Add("eXtended Particle System");
  1565. save_dialog->OnOK = (CONTROL_EVENT)&TMainWindow::RealSaveAs;
  1566. save_dialog->StartDirectory = string(string (pEditor->GetStartDir()) + "\\resource\\particles\\").GetBuffer();
  1567. Application->ShowModal(save_dialog);
  1568. save_dialog->Filter->SelectItem (1);
  1569. }
  1570. void _cdecl TMainWindow::RealSaveAs (GUIControl* sender)
  1571. {
  1572. GUIFileOpen* dialog = (GUIFileOpen*)sender;
  1573. string file = dialog->FileName;
  1574. file.AddExtention(".xps");
  1575. ParticleManager* pManager = (ParticleManager*)pEditor->Manager();
  1576. DWORD SystemCount = pManager->GetCreatedSystemCount();
  1577. if (SystemCount <= 0) return;
  1578. IParticleSystem* pSys = pManager->GetCreatedSystemByIndex(0);
  1579. const char* pSysName = pSys->GetName();
  1580. pManager->WriteSystemCacheAs(pSysName, file.GetBuffer());
  1581. ClearUndoSystem ();
  1582. string SystemName;
  1583. SystemName.GetFileName(file);
  1584. LoadToEditor (SystemName);
  1585. SaveOKTime = SAVEDOK_SHOWTIME;
  1586. }
  1587. void _cdecl TMainWindow::PausePressed (GUIControl* sender)
  1588. {
  1589. SystemIsPaused = !SystemIsPaused;
  1590. if (!SystemIsPaused)
  1591. {
  1592. btnPauseSystem->Down = false;
  1593. } else
  1594. {
  1595. SystemIsSlowMode = false;
  1596. btnPauseSystem->Down = true;
  1597. }
  1598. }
  1599. void _cdecl TMainWindow::SlowMotionPressed (GUIControl* sender)
  1600. {
  1601. SystemIsSlowMode = !SystemIsSlowMode;
  1602. if (!SystemIsSlowMode)
  1603. {
  1604. btnSlowMotionSystem->Down = false;
  1605. } else
  1606. {
  1607. SystemIsPaused = false;
  1608. btnSlowMotionSystem->Down = true;
  1609. }
  1610. }
  1611. void _cdecl TMainWindow::SelectBackgroundPressed (GUIControl* sender)
  1612. {
  1613. GUIFileOpen* fo = NEW GUIFileOpen ();
  1614. fo->Filters.Add (".txx");
  1615. fo->FiltersDesc.Add ("Texture file");
  1616. fo->OnOK = (CONTROL_EVENT)&TMainWindow::LoadBackgroundTexture;
  1617. fo->StartDirectory = string(string (pEditor->GetStartDir()) + "\\resource\\textures\\").GetBuffer();
  1618. Application->ShowModal (fo);
  1619. fo->Filter->SelectItem (1);
  1620. fo->MakeFlat(true);
  1621. }
  1622. void _cdecl TMainWindow::LoadBackgroundTexture (GUIControl* sender)
  1623. {
  1624. GUIFileOpen* fo = (GUIFileOpen*)sender;
  1625. string CropPath = string(pEditor->GetStartDir()) + "\\resource\\textures\\";
  1626. string TextureName = fo->FileName;
  1627. TextureName.GetRelativePath(CropPath);
  1628. if (pBackgroundTexture) pBackgroundTexture->Release ();
  1629. pBackgroundTexture = pEditor->Render()->CreateTexture(_FL_, TextureName.GetBuffer());
  1630. IFileService* pFS = (IFileService*)api->GetService("FileService");
  1631. IEditableIniFile* pIni = pFS->OpenEditableIniFile(api->Storage().GetString("system.ini"), file_open_always, _FL_);
  1632. Assert (pIni);
  1633. pIni->SetString("peditor", "backgroundname", (char*)TextureName.GetBuffer());
  1634. pIni->Release();
  1635. }
  1636. void _cdecl TMainWindow::btnShowDirPressed (GUIControl* sender)
  1637. {
  1638. bShowAxis = !bShowAxis;
  1639. if (!bShowAxis) btnShowDirection->Down = false;
  1640. }
  1641. void _cdecl TMainWindow::btnShowGridPressed (GUIControl* sender)
  1642. {
  1643. bDrawGrid = !bDrawGrid;
  1644. if (!bDrawGrid) btnShowGrid->Down = false;
  1645. }
  1646. void _cdecl TMainWindow::btnSimplePressed (GUIControl* sender)
  1647. {
  1648. pEditor->GetGizmo()->Enable(false);
  1649. }
  1650. void _cdecl TMainWindow::btnMovePressed (GUIControl* sender)
  1651. {
  1652. pEditor->GetGizmo()->Enable(true);
  1653. pEditor->GetGizmo()->SetType(TransformGizmo::GT_MOVE);
  1654. bGizmoMode->SelectItem(GZM_move_index);
  1655. }
  1656. void _cdecl TMainWindow::btnRotatePressed (GUIControl* sender)
  1657. {
  1658. pEditor->GetGizmo()->Enable(true);
  1659. pEditor->GetGizmo()->SetType(TransformGizmo::GT_ROTATE);
  1660. bGizmoMode->SelectItem(GZM_rotate_index);
  1661. }
  1662. void _cdecl TMainWindow::btnGizmoTypeChanged (GUIControl* sender)
  1663. {
  1664. if (bGizmoMode->ListBox->SelectedLine == 0)
  1665. {
  1666. pEditor->GetGizmo()->SetMode(TransformGizmo::GM_WORLD);
  1667. } else
  1668. {
  1669. pEditor->GetGizmo()->SetMode(TransformGizmo::GM_LOCAL);
  1670. }
  1671. if (pEditor->GetGizmo()->GetType() == TransformGizmo::GT_ROTATE)
  1672. {
  1673. GZM_rotate_index = bGizmoMode->ListBox->SelectedLine;
  1674. } else
  1675. {
  1676. GZM_move_index = bGizmoMode->ListBox->SelectedLine;
  1677. }
  1678. }
  1679. void _cdecl TMainWindow::btnResetTransformPressed (GUIControl* sender)
  1680. {
  1681. pEditor->GetGizmo()->SetTransform(Matrix());
  1682. SaveGizmoMatrix();
  1683. }
  1684. void _cdecl TMainWindow::btnLoadGMXPressed (GUIControl* sender)
  1685. {
  1686. GUIFileOpen* fo = NEW GUIFileOpen ();
  1687. fo->Filters.Add (".gmx");
  1688. fo->FiltersDesc.Add ("Geometry file");
  1689. fo->OnOK = (CONTROL_EVENT)&TMainWindow::LoadGMXFile;
  1690. fo->StartDirectory = string(string (pEditor->GetStartDir()) + "\\resource\\models\\").GetBuffer();
  1691. Application->ShowModal (fo);
  1692. fo->Filter->SelectItem (1);
  1693. fo->MakeFlat(true);
  1694. }
  1695. void _cdecl TMainWindow::LoadGMXFile (GUIControl* sender)
  1696. {
  1697. GUIFileOpen* fo = (GUIFileOpen*)sender;
  1698. string CropPath = string(pEditor->GetStartDir()) + "\\resource\\models\\";
  1699. string TextureName = fo->FileName;
  1700. TextureName.GetRelativePath(CropPath);
  1701. if (pGeom) pGeom->Release ();
  1702. IGMXService* pGEOServ = (IGMXService*)api->GetService("GMXService");
  1703. pGeom = pGEOServ->CreateGMX(TextureName.c_str(), null, NULL, NULL);
  1704. }
  1705. void _cdecl TMainWindow::DirectionalSelect (GUIControl* sender)
  1706. {
  1707. IRender* pRS = (IRender*)api->GetService("DX9Render");
  1708. Color directionalColor = pRS->GetGlobalLightColor();
  1709. GUIColorPicker* pGUIColor = NEW GUIColorPicker(0, 0, "test", 0, 0);
  1710. pGUIColor->bAlwaysOnTop = true;
  1711. pGUIColor->SetScreenCenter();
  1712. pGUIColor->labelHDR->Visible = true;
  1713. pGUIColor->HDRPower->Visible = true;
  1714. Vector vCol = directionalColor.v4.v;
  1715. float HDRK = vCol.Normalize();
  1716. pGUIColor->editA->Text = IntToStr ((int)255.0f);
  1717. pGUIColor->editR->Text = IntToStr ((int)(vCol.x * 255.0f));
  1718. pGUIColor->editG->Text = IntToStr ((int)(vCol.y * 255.0f));
  1719. pGUIColor->editB->Text = IntToStr ((int)(vCol.z * 255.0f));
  1720. pGUIColor->HDRPower->Text = FloatToStr (HDRK);
  1721. pGUIColor->TextIsChanged (NULL);
  1722. pGUIColor->OnApply = (CONTROL_EVENT)&TMainWindow::ApplyDirectionalColor;
  1723. //igui->ShowModal(pGUIColor);
  1724. Application->ShowModal(pGUIColor);
  1725. }
  1726. void _cdecl TMainWindow::AmbientSelect (GUIControl* sender)
  1727. {
  1728. IRender* pRS = (IRender*)api->GetService("DX9Render");
  1729. Color BackgroundColor = pRS->GetAmbient();
  1730. GUIColorPicker* pGUIColor = NEW GUIColorPicker(0, 0, "test", 0, 0);
  1731. pGUIColor->bAlwaysOnTop = true;
  1732. pGUIColor->SetScreenCenter();
  1733. pGUIColor->editA->Text = IntToStr ((int)(BackgroundColor.a * 255.0f));
  1734. pGUIColor->editR->Text = IntToStr ((int)(BackgroundColor.r * 255.0f));
  1735. pGUIColor->editG->Text = IntToStr ((int)(BackgroundColor.g * 255.0f));
  1736. pGUIColor->editB->Text = IntToStr ((int)(BackgroundColor.b * 255.0f));
  1737. pGUIColor->TextIsChanged (NULL);
  1738. pGUIColor->OnApply = (CONTROL_EVENT)&TMainWindow::ApplyBackgroundColor;
  1739. //igui->ShowModal(pGUIColor);
  1740. Application->ShowModal(pGUIColor);
  1741. }
  1742. void _cdecl TMainWindow::ApplyBackgroundColor (GUIControl* sender)
  1743. {
  1744. GUIColorPicker* pGUIColor = (GUIColorPicker*)sender;
  1745. Color BackgroundColor = (dword)pGUIColor->SelectedColor;
  1746. IRender* pRS = (IRender*)api->GetService("DX9Render");
  1747. IFileService* pFS = (IFileService*)api->GetService("FileService");
  1748. IEditableIniFile* pEngineIni = pFS->OpenEditableIniFile(api->Storage().GetString("system.ini"), file_open_always, _FL_);
  1749. if (pEngineIni)
  1750. {
  1751. pEngineIni->SetFloat("Ambient", "R", BackgroundColor.r);
  1752. pEngineIni->SetFloat("Ambient", "G", BackgroundColor.g);
  1753. pEngineIni->SetFloat("Ambient", "B", BackgroundColor.b);
  1754. pEngineIni->Release();
  1755. pEngineIni = NULL;
  1756. }
  1757. pRS->SetAmbient(BackgroundColor);
  1758. }
  1759. void _cdecl TMainWindow::ApplyDirectionalColor (GUIControl* sender)
  1760. {
  1761. GUIColorPicker* pGUIColor = (GUIColorPicker*)sender;
  1762. Color directionalColor = (dword)pGUIColor->SelectedColor;
  1763. float HDRPower = (float)atof (pGUIColor->HDRPower->Text.c_str());
  1764. directionalColor = directionalColor * HDRPower;
  1765. IRender* pRS = (IRender*)api->GetService("DX9Render");
  1766. IFileService* pFS = (IFileService*)api->GetService("FileService");
  1767. IEditableIniFile* pEngineIni = pFS->OpenEditableIniFile(api->Storage().GetString("system.ini"), file_open_always, _FL_);
  1768. if (pEngineIni)
  1769. {
  1770. pEngineIni->SetFloat("Directional", "R", directionalColor.r);
  1771. pEngineIni->SetFloat("Directional", "G", directionalColor.g);
  1772. pEngineIni->SetFloat("Directional", "B", directionalColor.b);
  1773. pEngineIni->Release();
  1774. pEngineIni = NULL;
  1775. }
  1776. pRS->SetGlobalLight(pRS->GetGlobalLightDirection(), false, directionalColor, Color(0x0L));
  1777. }
  1778. void TMainWindow::Autosave ()
  1779. {
  1780. TimeFromLastAutoSave += api->GetDeltaTime();
  1781. if (TimeFromLastAutoSave < 180.0f) return;
  1782. TimeFromLastAutoSave = 0.0f;
  1783. BOOL bFldrRes = CreateDirectory(".\\ParticlesAutoSave", 0);
  1784. string autosaveName;
  1785. autosaveName.Format(".\\ParticlesAutoSave\\autosave_%03d.xps", AutoSaveIndex);
  1786. AutoSaveIndex++;
  1787. if (AutoSaveIndex > MaxAutoSaveSlots) AutoSaveIndex = 0;
  1788. ParticleManager* pManager = (ParticleManager*)pEditor->Manager();
  1789. DWORD SystemCount = pManager->GetCreatedSystemCount();
  1790. if (SystemCount > 0)
  1791. {
  1792. IParticleSystem* pSys = pManager->GetCreatedSystemByIndex(0);
  1793. const char* pSysName = pSys->GetName();
  1794. pManager->WriteSystemCacheAs(pSysName, autosaveName.c_str());
  1795. }
  1796. }
  1797. void TMainWindow::SaveGizmoMatrix ()
  1798. {
  1799. if (!pEditor->GetGizmo()) return;
  1800. Matrix mGizmoTransform = pEditor->GetGizmo()->GetTransform();
  1801. IFileService* pFS = (IFileService*)api->GetService("FileService");
  1802. IEditableIniFile* pIni = pFS->OpenEditableIniFile(api->Storage().GetString("system.ini"), file_open_always, _FL_);
  1803. if (!pIni)
  1804. {
  1805. return;
  1806. }
  1807. pIni->SetFloat("peditor", "m_0_0", mGizmoTransform.m[0][0]);
  1808. pIni->SetFloat("peditor", "m_1_0", mGizmoTransform.m[0][1]);
  1809. pIni->SetFloat("peditor", "m_2_0", mGizmoTransform.m[0][2]);
  1810. pIni->SetFloat("peditor", "m_0_1", mGizmoTransform.m[1][0]);
  1811. pIni->SetFloat("peditor", "m_1_1", mGizmoTransform.m[1][1]);
  1812. pIni->SetFloat("peditor", "m_2_1", mGizmoTransform.m[1][2]);
  1813. pIni->SetFloat("peditor", "m_0_2", mGizmoTransform.m[2][0]);
  1814. pIni->SetFloat("peditor", "m_1_2", mGizmoTransform.m[2][1]);
  1815. pIni->SetFloat("peditor", "m_2_2", mGizmoTransform.m[2][2]);
  1816. pIni->SetFloat("peditor", "m_0_3", mGizmoTransform.m[3][0]);
  1817. pIni->SetFloat("peditor", "m_1_3", mGizmoTransform.m[3][1]);
  1818. pIni->SetFloat("peditor", "m_2_3", mGizmoTransform.m[3][2]);
  1819. /*
  1820. const char* szBackground = pIni->GetString("peditor", "backgroundname", NULL);
  1821. if (szBackground)
  1822. {
  1823. pBackgroundTexture = pEditor->Render()->CreateTexture(_FL_, szBackground);
  1824. }
  1825. */
  1826. pIni->Release();
  1827. }
  1828. #endif