particleEmitterEditor.ed.tscript 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) 2012 GarageGames, LLC
  3. //
  4. // Permission is hereby granted, free of charge, to any person obtaining a copy
  5. // of this software and associated documentation files (the "Software"), to
  6. // deal in the Software without restriction, including without limitation the
  7. // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  8. // sell copies of the Software, and to permit persons to whom the Software is
  9. // furnished to do so, subject to the following conditions:
  10. //
  11. // The above copyright notice and this permission notice shall be included in
  12. // all copies or substantial portions of the Software.
  13. //
  14. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  20. // IN THE SOFTWARE.
  21. //-----------------------------------------------------------------------------
  22. $PE_EMITTEREDITOR_DEFAULT_FILENAME = "data/managedParticleEmitterData." @ $TorqueScriptFileExtension;
  23. //=============================================================================================
  24. // PE_EmitterEditor.
  25. //=============================================================================================
  26. //---------------------------------------------------------------------------------------------
  27. function PE_EmitterEditor::guiSync( %this )
  28. {
  29. %data = PE_EmitterEditor.currEmitter;
  30. // Sync up sliders and number boxes.
  31. if( PE_EmitterEditor-->PEE_infiniteLoop.isStateOn() )
  32. {
  33. PE_EmitterEditor-->PEE_lifetimeMS_slider.setActive( false );
  34. PE_EmitterEditor-->PEE_lifetimeMS_textEdit.setActive( false );
  35. PE_EmitterEditor-->PEE_lifetimeVarianceMS_slider.setActive( false );
  36. PE_EmitterEditor-->PEE_lifetimeVarianceMS_textEdit.setActive( false );
  37. }
  38. else
  39. {
  40. PE_EmitterEditor-->PEE_lifetimeMS_slider.setActive( true );
  41. PE_EmitterEditor-->PEE_lifetimeMS_textEdit.setActive( true );
  42. PE_EmitterEditor-->PEE_lifetimeVarianceMS_slider.setActive( true );
  43. PE_EmitterEditor-->PEE_lifetimeVarianceMS_textEdit.setActive( true );
  44. PE_EmitterEditor-->PEE_lifetimeMS_slider.setValue( %data.lifetimeMS );
  45. PE_EmitterEditor-->PEE_lifetimeMS_textEdit.setText( %data.lifetimeMS );
  46. PE_EmitterEditor-->PEE_lifetimeVarianceMS_slider.setValue( %data.lifetimeVarianceMS );
  47. PE_EmitterEditor-->PEE_lifetimeVarianceMS_textEdit.setText( %data.lifetimeVarianceMS );
  48. }
  49. PE_EmitterEditor-->PEE_ejectionPeriodMS_slider.setValue( %data.ejectionPeriodMS );
  50. PE_EmitterEditor-->PEE_ejectionPeriodMS_textEdit.setText( %data.ejectionPeriodMS );
  51. PE_EmitterEditor-->PEE_periodVarianceMS_slider.setValue( %data.periodVarianceMS );
  52. PE_EmitterEditor-->PEE_periodVarianceMS_textEdit.setText( %data.periodVarianceMS );
  53. PE_EmitterEditor-->PEE_ejectionVelocity_slider.setValue( %data.ejectionVelocity );
  54. PE_EmitterEditor-->PEE_ejectionVelocity_textEdit.setText( %data.ejectionVelocity );
  55. PE_EmitterEditor-->PEE_velocityVariance_slider.setValue( %data.velocityVariance );
  56. PE_EmitterEditor-->PEE_velocityVariance_textEdit.setText( %data.velocityVariance );
  57. PE_EmitterEditor-->PEE_orientParticles.setValue( %data.orientParticles );
  58. PE_EmitterEditor-->PEE_alignParticles.setValue( %data.alignParticles );
  59. PE_EmitterEditor-->PEE_alignDirection.setText( %data.alignDirection );
  60. PE_EmitterEditor-->PEE_ribbonParticles.setValue( %data.ribbonParticles );
  61. PE_EmitterEditor-->PEE_thetaMin_slider.setValue( %data.thetaMin );
  62. PE_EmitterEditor-->PEE_thetaMin_textEdit.setText( %data.thetaMin );
  63. PE_EmitterEditor-->PEE_thetaMax_slider.setValue( %data.thetaMax );
  64. PE_EmitterEditor-->PEE_thetaMax_textEdit.setText( %data.thetaMax );
  65. PE_EmitterEditor-->PEE_thetaVar_slider.setValue( %data.thetaVariance );
  66. PE_EmitterEditor-->PEE_thetaVar_textEdit.setText( %data.thetaVariance );
  67. PE_EmitterEditor-->PEE_phiVariance_slider.setValue( %data.phiVariance );
  68. PE_EmitterEditor-->PEE_phiVariance_textEdit.setText( %data.phiVariance );
  69. PE_EmitterEditor-->PEE_ejectionOffset_slider.setValue( %data.ejectionOffset );
  70. PE_EmitterEditor-->PEE_ejectionOffset_textEdit.setText( %data.ejectionOffset );
  71. PE_EmitterEditor-->PEE_ejectionOffsetVariance_slider.setValue( %data.ejectionOffsetVariance );
  72. PE_EmitterEditor-->PEE_ejectionOffsetVariance_textEdit.setText( %data.ejectionOffsetVariance );
  73. %blendTypeId = PE_EmitterEditor-->PEE_blendType.findText( %data.blendStyle );
  74. PE_EmitterEditor-->PEE_blendType.setSelected( %blendTypeId, false );
  75. PE_EmitterEditor-->PEE_softnessDistance_slider.setValue( %data.softnessDistance );
  76. PE_EmitterEditor-->PEE_softnessDistance_textEdit.setText( %data.softnessDistance );
  77. PE_EmitterEditor-->PEE_ambientFactor_slider.setValue( %data.ambientFactor );
  78. PE_EmitterEditor-->PEE_ambientFactor_textEdit.setText( %data.ambientFactor );
  79. PE_EmitterEditor-->PEE_softParticles.setValue( %data.softParticles );
  80. PE_EmitterEditor-->PEE_reverseOrder.setValue( %data.reverseOrder );
  81. PE_EmitterEditor-->PEE_useEmitterSizes.setValue( %data.useEmitterSizes );
  82. PE_EmitterEditor-->PEE_useEmitterColors.setValue( %data.useEmitterColors );
  83. PE_EmitterEditor-->PEE_glow.setValue( %data.glow );
  84. // Sync up particle selectors.
  85. for( %index = 0; %index < 4; %index ++ )
  86. {
  87. %ctrl = "PEE_EmitterParticle" @ ( %index + 1 );
  88. %popup = %ctrl-->PopUpMenu;
  89. %particle = getWord( %data.particles, %index );
  90. if( isObject( %particle ) )
  91. %popup.setSelected( %particle.getId(), false );
  92. else
  93. %popup.setSelected( 0, false ); // Select "None".
  94. }
  95. }
  96. //---------------------------------------------------------------------------------------------
  97. // Generic updateEmitter method
  98. function PE_EmitterEditor::updateEmitter( %this, %propertyField, %value, %isSlider, %onMouseUp )
  99. {
  100. PE_EmitterEditor.setEmitterDirty();
  101. %emitter = PE_EmitterEditor.currEmitter;
  102. %last = Editor.getUndoManager().getUndoAction(Editor.getUndoManager().getUndoCount() - 1);
  103. if( (%isSlider) && (%last.isSlider) && (!%last.onMouseUp) )
  104. {
  105. %last.field = %propertyField;
  106. %last.isSlider = %isSlider;
  107. %last.onMouseUp = %onMouseUp;
  108. %last.newValue = %value;
  109. }
  110. else
  111. {
  112. %action = ParticleEditor.createUndo(ActionUpdateActiveEmitter, "Update Active Emitter");
  113. %action.emitter = %emitter;
  114. %action.field = %propertyField;
  115. %action.isSlider = %isSlider;
  116. %action.onMouseUp = %onMouseUp;
  117. %action.newValue = %value;
  118. %action.oldValue = %emitter.getFieldValue( %propertyField );
  119. ParticleEditor.submitUndo( %action );
  120. }
  121. %emitter.setFieldValue( %propertyField, %value );
  122. %emitter.reload();
  123. }
  124. //---------------------------------------------------------------------------------------------
  125. // Special case updateEmitter methods
  126. function PE_EmitterEditor::updateLifeFields( %this, %isRandom, %value, %isSlider, %onMouseUp )
  127. {
  128. PE_EmitterEditor.setEmitterDirty();
  129. %emitter = PE_EmitterEditor.currEmitter;
  130. // Transfer values over to gui controls.
  131. if( %isRandom )
  132. {
  133. if( %value > 0 )
  134. %value++;
  135. if( %value > PE_EmitterEditor-->PEE_lifetimeMS_slider.getValue() )
  136. {
  137. PE_EmitterEditor-->PEE_lifetimeMS_textEdit.setText( %value );
  138. PE_EmitterEditor-->PEE_lifetimeMS_slider.setValue( %value );
  139. }
  140. }
  141. else
  142. {
  143. if( %value > 0 )
  144. %value --;
  145. if( %value < PE_EmitterEditor-->PEE_lifetimeVarianceMS_slider.getValue() )
  146. {
  147. PE_EmitterEditor-->PEE_lifetimeVarianceMS_textEdit.setText( %value );
  148. PE_EmitterEditor-->PEE_lifetimeVarianceMS_slider.setValue( %value );
  149. }
  150. }
  151. // Submit undo.
  152. %last = Editor.getUndoManager().getUndoAction(Editor.getUndoManager().getUndoCount() - 1);
  153. if( (%isSlider) && (%last.isSlider) && (!%last.onMouseUp) )
  154. {
  155. %last.isSlider = %isSlider;
  156. %last.onMouseUp = %onMouseUp;
  157. %last.newValueLifetimeMS = PE_EmitterEditor-->PEE_lifetimeMS_textEdit.getText();
  158. %last.newValueLifetimeVarianceMS = PE_EmitterEditor-->PEE_lifetimeVarianceMS_textEdit.getText();
  159. }
  160. else
  161. {
  162. %action = ParticleEditor.createUndo(ActionUpdateActiveEmitterLifeFields, "Update Active Emitter");
  163. %action.emitter = %emitter;
  164. %action.isSlider = %isSlider;
  165. %action.onMouseUp = %onMouseUp;
  166. %action.newValueLifetimeMS = PE_EmitterEditor-->PEE_lifetimeMS_textEdit.getText();
  167. %action.oldValueLifetimeMS = %emitter.lifetimeMS;
  168. %action.newValueLifetimeVarianceMS = PE_EmitterEditor-->PEE_lifetimeVarianceMS_textEdit.getText();
  169. %action.oldValueLifetimeVarianceMS = %emitter.lifetimeVarianceMS;
  170. ParticleEditor.submitUndo( %action );
  171. }
  172. // Set the values on the current emitter.
  173. %emitter.lifetimeMS = PE_EmitterEditor-->PEE_lifetimeMS_textEdit.getText();
  174. %emitter.lifetimeVarianceMS = PE_EmitterEditor-->PEE_lifetimeVarianceMS_textEdit.getText();
  175. %emitter.reload();
  176. // Keep the infiniteLoop checkbox up to date.
  177. PE_EmitterEditor-->PEE_infiniteLoop.setStateOn(
  178. %emitter.lifetimeMS == 0
  179. );
  180. }
  181. //---------------------------------------------------------------------------------------------
  182. function PE_EmitterEditor::updateLifeFieldsInfiniteLoop( %this )
  183. {
  184. %emitter = PE_EmitterEditor.currEmitter;
  185. %isEnabled = PE_EmitterEditor-->PEE_infiniteLoop.isStateOn();
  186. // Submit undo.
  187. %action = ParticleEditor.createUndo( ActionUpdateActiveEmitterLifeFields, "Update Active Emitter" );
  188. %action.emitter = %emitter;
  189. if( %isEnabled )
  190. {
  191. %action.newValueLifetimeMS = 0;
  192. %action.newvalueLifetimeVarianceMS = 0;
  193. %action.oldValueLifetimeMS = PE_EmitterEditor-->PEE_lifetimeMS_textEdit.getText();
  194. %action.oldValueLifetimeVarianceMS = PE_EmitterEditor-->PEE_lifetimeVarianceMS_textEdit.getText();
  195. }
  196. else
  197. {
  198. %action.newValueLifetimeMS = PE_EmitterEditor-->PEE_lifetimeMS_textEdit.getText();
  199. %action.newvalueLifetimeVarianceMS = PE_EmitterEditor-->PEE_lifetimeVarianceMS_textEdit.getText();
  200. %action.oldValueLifetimeMS = 0;
  201. %action.oldValueLifetimeVarianceMS = 0;
  202. }
  203. ParticleEditor.submitUndo( %action );
  204. // Execute action.
  205. %action.redo();
  206. }
  207. //---------------------------------------------------------------------------------------------
  208. function PE_EmitterEditor::updateAmountFields( %this, %isRandom, %value, %isSlider, %onMouseUp )
  209. {
  210. PE_EmitterEditor.setEmitterDirty();
  211. %emitter = PE_EmitterEditor.currEmitter;
  212. // Transfer values over to gui controls.
  213. if( %isRandom )
  214. {
  215. %value ++;
  216. if( %value > PE_EmitterEditor-->PEE_ejectionPeriodMS_slider.getValue() )
  217. {
  218. PE_EmitterEditor-->PEE_ejectionPeriodMS_textEdit.setText( %value );
  219. PE_EmitterEditor-->PEE_ejectionPeriodMS_slider.setValue( %value );
  220. }
  221. }
  222. else
  223. {
  224. %value --;
  225. if( %value < PE_EmitterEditor-->PEE_periodVarianceMS_slider.getValue() )
  226. {
  227. PE_EmitterEditor-->PEE_periodVarianceMS_textEdit.setText( %value );
  228. PE_EmitterEditor-->PEE_periodVarianceMS_slider.setValue( %value );
  229. }
  230. }
  231. // Submit undo.
  232. %last = Editor.getUndoManager().getUndoAction(Editor.getUndoManager().getUndoCount() - 1);
  233. if( (%isSlider) && (%last.isSlider) && (!%last.onMouseUp) )
  234. {
  235. %last.isSlider = %isSlider;
  236. %last.onMouseUp = %onMouseUp;
  237. %last.newValueEjectionPeriodMS = PE_EmitterEditor-->PEE_ejectionPeriodMS_textEdit.getText();
  238. %last.newValuePeriodVarianceMS = PE_EmitterEditor-->PEE_periodVarianceMS_textEdit.getText();
  239. }
  240. else
  241. {
  242. %action = ParticleEditor.createUndo(ActionUpdateActiveEmitterAmountFields, "Update Active Emitter");
  243. %action.emitter = %emitter;
  244. %action.isSlider = %isSlider;
  245. %action.onMouseUp = %onMouseUp;
  246. %action.newValueEjectionPeriodMS = PE_EmitterEditor-->PEE_ejectionPeriodMS_textEdit.getText();
  247. %action.oldValueEjectionPeriodMS = %emitter.ejectionPeriodMS;
  248. %action.newValuePeriodVarianceMS = PE_EmitterEditor-->PEE_periodVarianceMS_textEdit.getText();
  249. %action.oldValuePeriodVarianceMS = %emitter.periodVarianceMS;
  250. ParticleEditor.submitUndo( %action );
  251. }
  252. // Set the values on the current emitter.
  253. %emitter.ejectionPeriodMS = PE_EmitterEditor-->PEE_ejectionPeriodMS_textEdit.getText();
  254. %emitter.periodVarianceMS = PE_EmitterEditor-->PEE_periodVarianceMS_textEdit.getText();
  255. %emitter.reload();
  256. }
  257. //---------------------------------------------------------------------------------------------
  258. function PE_EmitterEditor::updateSpeedFields( %this, %isRandom, %value, %isSlider, %onMouseUp )
  259. {
  260. PE_EmitterEditor.setEmitterDirty();
  261. %emitter = PE_EmitterEditor.currEmitter;
  262. // Transfer values over to gui controls.
  263. if( %isRandom )
  264. {
  265. if( %value > PE_EmitterEditor-->PEE_ejectionVelocity_slider.getValue() )
  266. {
  267. PE_EmitterEditor-->PEE_ejectionVelocity_textEdit.setText( %value );
  268. PE_EmitterEditor-->PEE_ejectionVelocity_slider.setValue( %value );
  269. }
  270. }
  271. else
  272. {
  273. if( %value < PE_EmitterEditor-->PEE_velocityVariance_slider.getValue() )
  274. {
  275. PE_EmitterEditor-->PEE_velocityVariance_textEdit.setText( %value );
  276. PE_EmitterEditor-->PEE_velocityVariance_slider.setValue( %value );
  277. }
  278. }
  279. // Submit undo.
  280. %last = Editor.getUndoManager().getUndoAction(Editor.getUndoManager().getUndoCount() - 1);
  281. if( (%isSlider) && (%last.isSlider) && (!%last.onMouseUp) )
  282. {
  283. %last.isSlider = %isSlider;
  284. %last.onMouseUp = %onMouseUp;
  285. %last.newValueEjectionVelocity = PE_EmitterEditor-->PEE_ejectionVelocity_textEdit.getText();
  286. %last.newValueVelocityVariance = PE_EmitterEditor-->PEE_velocityVariance_textEdit.getText();
  287. }
  288. else
  289. {
  290. %action = ParticleEditor.createUndo(ActionUpdateActiveEmitterSpeedFields, "Update Active Emitter");
  291. %action.emitter = %emitter;
  292. %action.isSlider = %isSlider;
  293. %action.onMouseUp = %onMouseUp;
  294. %action.newValueEjectionVelocity = PE_EmitterEditor-->PEE_ejectionVelocity_textEdit.getText();
  295. %action.oldValueEjectionVelocity = %emitter.ejectionVelocity;
  296. %action.newValueVelocityVariance = PE_EmitterEditor-->PEE_velocityVariance_textEdit.getText();
  297. %action.oldValueVelocityVariance = %emitter.velocityVariance;
  298. ParticleEditor.submitUndo( %action );
  299. }
  300. // Set the values on the current emitter.
  301. %emitter.ejectionVelocity = PE_EmitterEditor-->PEE_ejectionVelocity_textEdit.getText();
  302. %emitter.velocityVariance = PE_EmitterEditor-->PEE_velocityVariance_textEdit.getText();
  303. %emitter.reload();
  304. }
  305. //---------------------------------------------------------------------------------------------
  306. function PE_EmitterEditor::updateParticlesFields( %this )
  307. {
  308. %particles = "";
  309. for( %i = 1; %i < 5; %i ++ )
  310. {
  311. %emitterParticle = "PEE_EmitterParticle" @ %i;
  312. %popup = %emitterParticle-->PopUpMenu;
  313. %text = %popup.getText();
  314. if( %text $= "" || %text $= "None" )
  315. continue;
  316. if( %particles $= "" )
  317. %particles = %text;
  318. else
  319. %particles = %particles SPC %text;
  320. }
  321. %changedEditParticle = 1;
  322. %currParticle = PE_ParticleEditor.currParticle.getName();
  323. foreach$( %particleName in %particles )
  324. {
  325. if( %particleName $= %currParticle )
  326. {
  327. %changedEditParticle = 0;
  328. break;
  329. }
  330. }
  331. // True only if the currently edited particle has not been found and the
  332. // ParticleEditor is dirty.
  333. if( %changedEditParticle && PE_ParticleEditor.dirty )
  334. {
  335. toolsMessageBoxYesNoCancel("Save Particle Changes?",
  336. "Do you wish to save the changes made to the <br>current particle before changing the particle?",
  337. "PE_ParticleEditor.saveParticle( " @ PE_ParticleEditor.currParticle.getName() @ " ); PE_EmitterEditor.updateEmitter( \"particles\"," @ %particles @ ");",
  338. "PE_ParticleEditor.saveParticleDialogDontSave( " @ PE_ParticleEditor.currParticle.getName() @ " ); PE_EmitterEditor.updateEmitter( \"particles\"," @ %particles @ ");",
  339. "PE_EmitterEditor.guiSync();" );
  340. }
  341. else
  342. {
  343. PE_EmitterEditor.updateEmitter( "particles", %particles );
  344. }
  345. }
  346. //---------------------------------------------------------------------------------------------
  347. function PE_EmitterEditor::onNewEmitter( %this )
  348. {
  349. if( isObject( PE_EmitterEditor.currEmitter )
  350. && PE_EmitterEditor.currEmitter $= PEE_EmitterSelector.getSelected() )
  351. return;
  352. //FIXME: disregards particle tab dirty state
  353. if( PE_EmitterEditor.dirty )
  354. {
  355. if( PE_ParticleEditor.dirty )
  356. {
  357. toolsMessageBoxYesNo("Save Existing Particle?",
  358. "Do you want to save changes to <br><br>" @ PE_ParticleEditor.currParticle.getName(),
  359. "PE_ParticleEditor.saveParticle(" @ PE_ParticleEditor.currParticle @ ");"
  360. );
  361. }
  362. %savedEmitter = PE_EmitterEditor.currEmitter;
  363. toolsMessageBoxYesNoCancel("Save Existing Emitter?",
  364. "Do you want to save changes to <br><br>" @ %savedEmitter.getName(),
  365. "PE_EmitterEditor.saveEmitter(" @ %savedEmitter@ "); PE_EmitterEditor.loadNewEmitter();",
  366. "PE_EmitterEditor.saveEmitterDialogDontSave(" @ %savedEmitter @ "); PE_EmitterEditor.loadNewEmitter();"
  367. );
  368. }
  369. else
  370. {
  371. PE_EmitterEditor.loadNewEmitter();
  372. }
  373. }
  374. //---------------------------------------------------------------------------------------------
  375. function PE_EmitterEditor::loadNewEmitter( %this, %emitter )
  376. {
  377. if( isObject( %emitter ) )
  378. %current = %emitter.getId();
  379. else
  380. %current = PEE_EmitterSelector.getSelected();
  381. PE_EmitterEditor.currEmitter = %current;
  382. PE_EmitterEditor_NotDirtyEmitter.assignFieldsFrom( %current );
  383. PE_EmitterEditor_NotDirtyEmitter.originalName = %current.name;
  384. PE_EmitterEditor.guiSync();
  385. PE_EmitterEditor.setEmitterNotDirty();
  386. PE_ParticleEditor.loadNewParticle( getWord( %current.particles, 0 ) );
  387. ParticleEditor.updateEmitterNode();
  388. PE_EmitterEditor-->PEE_infiniteLoop.setStateOn( %current.lifetimeMS == 0 );
  389. }
  390. //---------------------------------------------------------------------------------------------
  391. function PE_EmitterEditor::setEmitterDirty( %this )
  392. {
  393. PE_EmitterEditor.text = "Emitter *";
  394. PE_EmitterEditor.dirty = true;
  395. %emitter = PE_EmitterEditor.currEmitter;
  396. %filename = %emitter.getFilename();
  397. %editorFilename = "tools/particleEditor/particleEmitterEditor.ed." @ $TorqueScriptFileExtension;
  398. if( %filename $= "" || %filename $= %editorFilename )
  399. PE_EmitterSaver.setDirty( %emitter, $PE_EMITTEREDITOR_DEFAULT_FILENAME );
  400. else
  401. PE_EmitterSaver.setDirty( %emitter );
  402. }
  403. //---------------------------------------------------------------------------------------------
  404. function PE_EmitterEditor::setEmitterNotDirty( %this )
  405. {
  406. PE_EmitterEditor.text = "Emitter";
  407. PE_EmitterEditor.dirty = false;
  408. PE_EmitterSaver.clearAll();
  409. }
  410. //---------------------------------------------------------------------------------------------
  411. // Create Functionality
  412. function PE_EmitterEditor::showNewDialog( %this )
  413. {
  414. //FIXME: disregards particle tab dirty state
  415. // Open a dialog if the current emitter is dirty.
  416. if( PE_ParticleEditor.dirty )
  417. {
  418. toolsMessageBoxYesNo("Save Existing Particle?",
  419. "Do you want to save changes to <br><br>" @ PE_ParticleEditor.currParticle.getName(),
  420. "PE_ParticleEditor.saveParticle(" @ PE_ParticleEditor.currParticle @ ");"
  421. );
  422. }
  423. if( PE_EmitterEditor.dirty )
  424. {
  425. toolsMessageBoxYesNoCancel("Save Emitter Changes?",
  426. "Do you wish to save the changes made to the <br>current emitter before changing the emitter?",
  427. "PE_EmitterEditor.saveEmitter( " @ PE_EmitterEditor.currEmitter.getName() @ " ); PE_EmitterEditor.createEmitter();",
  428. "PE_EmitterEditor.saveEmitterDialogDontSave( " @ PE_EmitterEditor.currEmitter.getName() @ " ); PE_EmitterEditor.createEmitter();"
  429. );
  430. }
  431. else
  432. {
  433. PE_EmitterEditor.createEmitter();
  434. }
  435. }
  436. //---------------------------------------------------------------------------------------------
  437. function PE_EmitterEditor::createEmitter( %this )
  438. {
  439. AssetBrowser_SelectModule.showDialog("PE_EmitterEditor.pickedNewEmitterTargetModule");
  440. AssetBrowser_SelectModuleWindow.selectWindow();
  441. }
  442. function PE_EmitterEditor::pickedNewEmitterTargetModule( %this, %module )
  443. {
  444. %moduleDef = ModuleDatabase.findModule(%module);
  445. PE_EmitterEditor.targetModule = %module;
  446. $PE_EMITTEREDITOR_DEFAULT_FILENAME = %moduleDef.ModulePath @ "/scripts/managedData/managedParticleEmitterData." @ $TorqueScriptFileExtension;
  447. if(!isDirectory(filePath($PE_EMITTEREDITOR_DEFAULT_FILENAME)))
  448. {
  449. AssetBrowser.dirHandler.createFolder(filePath($PE_EMITTEREDITOR_DEFAULT_FILENAME));
  450. }
  451. // Create a new emitter.
  452. %emitter = getUniqueName( "newEmitter" );
  453. datablock ParticleEmitterData( %emitter : DefaultEmitter )
  454. {
  455. };
  456. // Submit undo.
  457. %action = ParticleEditor.createUndo( ActionCreateNewEmitter, "Create New Emitter" );
  458. %action.prevEmitter = PE_EmitterEditor.currEmitter;
  459. %action.emitter = %emitter.getId();
  460. %action.emitterName = %emitter;
  461. ParticleEditor.submitUndo( %action );
  462. // Execute action.
  463. %action.redo();
  464. PE_ParticleEditor.createParticle(false);
  465. }
  466. //---------------------------------------------------------------------------------------------
  467. function PE_EmitterEditor::showDeleteDialog( %this )
  468. {
  469. if( PE_EmitterEditor.currEmitter.getName() $= "DefaultEmitter" )
  470. {
  471. toolsMessageBoxOK( "Error", "Cannot delete DefaultEmitter");
  472. return;
  473. }
  474. if( isObject( PE_EmitterEditor.currEmitter ) )
  475. {
  476. toolsMessageBoxYesNoCancel("Delete Emitter?",
  477. "Are you sure you want to delete<br><br>" @ PE_EmitterEditor.currEmitter.getName() @ "<br><br> Emitter deletion won't take affect until the level is exited.",
  478. "PE_EmitterEditor.saveEmitterDialogDontSave( " @ PE_EmitterEditor.currEmitter.getName() @ " ); PE_EmitterEditor.deleteEmitter();"
  479. );
  480. }
  481. }
  482. //---------------------------------------------------------------------------------------------
  483. function PE_EmitterEditor::deleteEmitter( %this )
  484. {
  485. %emitter = PE_EmitterEditor.currEmitter;
  486. // Create undo.
  487. %action = ParticleEditor.createUndo( ActionDeleteEmitter, "Delete Emitter" );
  488. %action.emitter = %emitter;
  489. %action.emitterFname = %emitter.getFilename();
  490. ParticleEditor.submitUndo( %action );
  491. // Execute action.
  492. %action.redo();
  493. }
  494. //---------------------------------------------------------------------------------------------
  495. function PE_EmitterEditor::saveEmitter( %this, %emitter )
  496. {
  497. if ( %emitter $= "" )
  498. %newName = PEE_EmitterSelector_Control->TextEdit.getText();
  499. else
  500. %newName = %emitter.getName();
  501. PE_EmitterEditor.currEmitter.setName( %newName );
  502. PE_EmitterEditor_NotDirtyEmitter.assignFieldsFrom( %emitter );
  503. PE_EmitterEditor_NotDirtyEmitter.originalName = %newName;
  504. PE_EmitterSaver.saveDirty();
  505. PE_EmitterEditor.currEmitter = %newName.getId();
  506. PE_EmitterEditor.setEmitterNotDirty();
  507. ParticleEditor.createParticleList();
  508. }
  509. //---------------------------------------------------------------------------------------------
  510. function PE_EmitterEditor::saveEmitterDialogDontSave( %this, %emitter)
  511. {
  512. %emitter.setName( PE_EmitterEditor_NotDirtyEmitter.originalName );
  513. %emitter.assignFieldsFrom( PE_EmitterEditor_NotDirtyEmitter );
  514. PE_EmitterEditor.setEmitterNotDirty();
  515. }
  516. //=============================================================================================
  517. // PEE_EmitterSelector_Control.
  518. //=============================================================================================
  519. //---------------------------------------------------------------------------------------------
  520. function PEE_EmitterSelector_Control::onRenameItem( %this )
  521. {
  522. Parent::onRenameItem( %this );
  523. //FIXME: need to check for validity of name and name clashes
  524. PE_EmitterEditor.setEmitterDirty();
  525. // Resort menu.
  526. %this-->PopupMenu.sort();
  527. }