particleParticleEditor.ed.tscript 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662
  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_PARTICLEEDITOR_DEFAULT_FILENAME = "data/managedParticleData." @ $TorqueScriptFileExtension;
  23. //=============================================================================================
  24. // PE_ParticleEditor.
  25. //=============================================================================================
  26. //---------------------------------------------------------------------------------------------
  27. function PE_ParticleEditor::guiSync( %this )
  28. {
  29. // Populate the selector with the particles assigned
  30. // to the current emitter.
  31. %containsCurrParticle = false;
  32. %popup = PEP_ParticleSelector;
  33. %popup.clear();
  34. foreach$( %particle in PE_EmitterEditor.currEmitter.particles )
  35. {
  36. if( %particle.getId() == PE_ParticleEditor.currParticle )
  37. %containsCurrParticle = true;
  38. %popup.add( %particle, %particle.getId() );
  39. }
  40. // Just in case the particle doesn't exist, fallback gracefully
  41. if( !%containsCurrParticle )
  42. PE_ParticleEditor.currParticle = getWord( PE_EmitterEditor.currEmitter.particles, 0 ).getId();
  43. %data = PE_ParticleEditor.currParticle;
  44. %popup.sort();
  45. %popup.setSelected( %data );
  46. %bitmap = %data.getTexture();
  47. %bitmapText = %bitmap !$= "" && %bitmap !$= $MaterialEditor::emptyMaterialImage ? %data.getTextureAsset() : "None";
  48. PE_ParticleEditor-->PEP_previewImageName.setText( %bitmapText );
  49. PE_ParticleEditor-->PEP_previewImageName.tooltip = %bitmapText;
  50. PE_ParticleEditor-->PEP_previewImage.setBitmap( getAssetPreviewImage(%bitmap) );
  51. PE_ParticleEditor-->PEP_inverseAlpha.setValue( %data.useInvAlpha );
  52. PE_ParticleEditor-->PEP_lifetimeMS_slider.setValue( %data.lifetimeMS );
  53. PE_ParticleEditor-->PEP_lifetimeMS_textEdit.setText( %data.lifetimeMS );
  54. PE_ParticleEditor-->PEP_lifetimeVarianceMS_slider.setValue( %data.lifetimeVarianceMS );
  55. PE_ParticleEditor-->PEP_lifetimeVarianceMS_textEdit.setText( %data.lifetimeVarianceMS );
  56. PE_ParticleEditor-->PEP_inheritedVelFactor_slider.setValue( %data.inheritedVelFactor );
  57. PE_ParticleEditor-->PEP_inheritedVelFactor_textEdit.setText( %data.inheritedVelFactor );
  58. PE_ParticleEditor-->PEP_constantAcceleration_slider.setValue( %data.constantAcceleration );
  59. PE_ParticleEditor-->PEP_constantAcceleration_textEdit.setText( %data.constantAcceleration );
  60. PE_ParticleEditor-->PEP_gravityCoefficient_slider.setValue( %data.gravityCoefficient );
  61. PE_ParticleEditor-->PEP_gravityCoefficient_textEdit.setText( %data.gravityCoefficient );
  62. PE_ParticleEditor-->PEP_dragCoefficient_slider.setValue( %data.dragCoefficient );
  63. PE_ParticleEditor-->PEP_dragCoefficient_textEdit.setText( %data.dragCoefficient );
  64. PE_ParticleEditor-->PEP_windCoefficient_slider.setValue( %data.windCoefficient );
  65. PE_ParticleEditor-->PEP_windCoefficient_textEdit.setText( %data.windCoefficient );
  66. PE_ParticleEditor-->PEP_spinRandomMin_slider.setValue( %data.spinRandomMin );
  67. PE_ParticleEditor-->PEP_spinRandomMin_textEdit.setText( %data.spinRandomMin );
  68. PE_ParticleEditor-->PEP_spinRandomMax_slider.setValue( %data.spinRandomMax );
  69. PE_ParticleEditor-->PEP_spinRandomMax_textEdit.setText( %data.spinRandomMax );
  70. PE_ParticleEditor-->PEP_spinRandomMax_slider.setValue( %data.spinRandomMax );
  71. PE_ParticleEditor-->PEP_spinRandomMax_textEdit.setText( %data.spinRandomMax );
  72. PE_ParticleEditor-->PEP_spinSpeed_slider.setValue( %data.spinSpeed );
  73. PE_ParticleEditor-->PEP_spinSpeed_textEdit.setText( %data.spinSpeed );
  74. PE_ColorTintSwatch0.color = %data.colors[ 0 ];
  75. PE_ColorTintSwatch1.color = %data.colors[ 1 ];
  76. PE_ColorTintSwatch2.color = %data.colors[ 2 ];
  77. PE_ColorTintSwatch3.color = %data.colors[ 3 ];
  78. PE_ColorTintSwatch4.color = %data.colors[ 4 ];
  79. PE_ColorTintSwatch5.color = %data.colors[ 5 ];
  80. PE_ColorTintSwatch6.color = %data.colors[ 6 ];
  81. PE_ColorTintSwatch7.color = %data.colors[ 7 ];
  82. PE_ParticleEditor-->PEP_pointSize_slider0.setValue( %data.sizes[ 0 ] );
  83. PE_ParticleEditor-->PEP_pointSize_textEdit0.setText( %data.sizes[ 0 ] );
  84. PE_ParticleEditor-->PEP_pointSize_slider1.setValue( %data.sizes[ 1 ] );
  85. PE_ParticleEditor-->PEP_pointSize_textEdit1.setText( %data.sizes[ 1 ] );
  86. PE_ParticleEditor-->PEP_pointSize_slider2.setValue( %data.sizes[ 2 ] );
  87. PE_ParticleEditor-->PEP_pointSize_textEdit2.setText( %data.sizes[ 2 ] );
  88. PE_ParticleEditor-->PEP_pointSize_slider3.setValue( %data.sizes[ 3 ] );
  89. PE_ParticleEditor-->PEP_pointSize_textEdit3.setText( %data.sizes[ 3 ] );
  90. PE_ParticleEditor-->PEP_pointSize_slider4.setValue( %data.sizes[ 4 ] );
  91. PE_ParticleEditor-->PEP_pointSize_textEdit4.setText( %data.sizes[ 4 ] );
  92. PE_ParticleEditor-->PEP_pointSize_slider5.setValue( %data.sizes[ 5 ] );
  93. PE_ParticleEditor-->PEP_pointSize_textEdit5.setText( %data.sizes[ 5 ] );
  94. PE_ParticleEditor-->PEP_pointSize_slider6.setValue( %data.sizes[ 6 ] );
  95. PE_ParticleEditor-->PEP_pointSize_textEdit6.setText( %data.sizes[ 6 ] );
  96. PE_ParticleEditor-->PEP_pointSize_slider7.setValue( %data.sizes[ 7 ] );
  97. PE_ParticleEditor-->PEP_pointSize_textEdit7.setText( %data.sizes[ 7 ] );
  98. PE_ParticleEditor-->PEP_pointTime_slider0.setValue( %data.times[ 0 ] );
  99. PE_ParticleEditor-->PEP_pointTime_textEdit0.setText( %data.times[ 0 ] );
  100. PE_ParticleEditor-->PEP_pointTime_slider1.setValue( %data.times[ 1 ] );
  101. PE_ParticleEditor-->PEP_pointTime_textEdit1.setText( %data.times[ 1 ] );
  102. PE_ParticleEditor-->PEP_pointTime_slider2.setValue( %data.times[ 2 ] );
  103. PE_ParticleEditor-->PEP_pointTime_textEdit2.setText( %data.times[ 2 ] );
  104. PE_ParticleEditor-->PEP_pointTime_slider3.setValue( %data.times[ 3 ] );
  105. PE_ParticleEditor-->PEP_pointTime_textEdit3.setText( %data.times[ 3 ] );
  106. PE_ParticleEditor-->PEP_pointTime_slider4.setValue( %data.times[ 4 ] );
  107. PE_ParticleEditor-->PEP_pointTime_textEdit4.setText( %data.times[ 4 ] );
  108. PE_ParticleEditor-->PEP_pointTime_slider5.setValue( %data.times[ 5 ] );
  109. PE_ParticleEditor-->PEP_pointTime_textEdit5.setText( %data.times[ 5 ] );
  110. PE_ParticleEditor-->PEP_pointTime_slider6.setValue( %data.times[ 6 ] );
  111. PE_ParticleEditor-->PEP_pointTime_textEdit6.setText( %data.times[ 6 ] );
  112. PE_ParticleEditor-->PEP_pointTime_slider7.setValue( %data.times[ 7 ] );
  113. PE_ParticleEditor-->PEP_pointTime_textEdit7.setText( %data.times[ 7 ] );
  114. //particle animation
  115. PE_ParticleEditor-->PEP_animateTexture.setValue( %data.animateTexture );
  116. PE_ParticleEditor-->PEP_framesPerSec_slider.setValue( %data.framesPerSec );
  117. PE_ParticleEditor-->PEP_framesPerSec_textEdit.setText( %data.framesPerSec );
  118. PE_ParticleEditor-->PEP_animTexFramesList_textEdit.setText( %data.animTexFrames );
  119. PE_ParticleEditor-->PEP_animTileCount_textEdit.setText( %data.animTexTiling );
  120. }
  121. //---------------------------------------------------------------------------------------------
  122. // Generic updateParticle method
  123. function PE_ParticleEditor::updateParticle(%this, %propertyField, %value, %isSlider, %onMouseUp)
  124. {
  125. PE_ParticleEditor.setParticleDirty();
  126. %particle = PE_ParticleEditor.currParticle;
  127. %last = Editor.getUndoManager().getUndoAction(Editor.getUndoManager().getUndoCount() - 1);
  128. if( (%isSlider) && (%last.isSlider) && (!%last.onMouseUp) )
  129. {
  130. %last.field = %propertyField;
  131. %last.isSlider = %isSlider;
  132. %last.onMouseUp = %onMouseUp;
  133. %last.newValue = %value;
  134. }
  135. else
  136. {
  137. %action = ParticleEditor.createUndo(ActionUpdateActiveParticle, "Update Active Particle");
  138. %action.particle = %particle;
  139. %action.field = %propertyField;
  140. %action.isSlider = %isSlider;
  141. %action.onMouseUp = %onMouseUp;
  142. %action.newValue = %value;
  143. %action.oldValue = %particle.getFieldValue( %propertyField );
  144. ParticleEditor.submitUndo( %action );
  145. }
  146. %particle.setFieldValue( %propertyField, %value );
  147. %particle.reload();
  148. }
  149. //---------------------------------------------------------------------------------------------
  150. // Special case updateEmitter methods
  151. function PE_ParticleEditor::updateParticleTexture( %this, %action )
  152. {
  153. if( %action )
  154. {
  155. AssetBrowser.showDialog("ImageAsset", "PE_ParticleEditor.onImageAssetSelected");
  156. }
  157. else
  158. {
  159. PE_ParticleEditor-->PEP_previewImage.setBitmap("");
  160. PE_ParticleEditor-->PEP_previewImageName.setText("");
  161. PE_ParticleEditor-->PEP_previewImageName.tooltip = "";
  162. PE_ParticleEditor.updateParticle( "textureName", "" );
  163. }
  164. }
  165. function PE_ParticleEditor::onImageAssetSelected(%this, %assetId)
  166. {
  167. if( AssetDatabase.isDeclaredAsset(%assetId) )
  168. {
  169. PE_ParticleEditor-->PEP_previewImage.setBitmap(%assetId);
  170. PE_ParticleEditor-->PEP_previewImageName.setText(%assetId);
  171. PE_ParticleEditor-->PEP_previewImageName.tooltip = %assetId;
  172. PE_ParticleEditor.updateParticle( "textureAsset", %assetId );
  173. }
  174. }
  175. //---------------------------------------------------------------------------------------------
  176. function PE_ParticleEditor::updateLifeFields( %this, %isRandom, %value, %isSlider, %onMouseUp )
  177. {
  178. PE_ParticleEditor.setParticleDirty();
  179. %particle = PE_ParticleEditor.currParticle;
  180. //Transfer values over to gui controls.
  181. if( %isRandom )
  182. {
  183. %value ++;
  184. if( %value > PE_ParticleEditor-->PEP_lifetimeMS_slider.getValue() )
  185. {
  186. PE_ParticleEditor-->PEP_lifetimeMS_textEdit.setText( %value );
  187. PE_ParticleEditor-->PEP_lifetimeMS_slider.setValue( %value );
  188. }
  189. }
  190. else
  191. {
  192. %value --;
  193. if( %value < PE_ParticleEditor-->PEP_lifetimeVarianceMS_slider.getValue() )
  194. {
  195. PE_ParticleEditor-->PEP_lifetimeVarianceMS_textEdit.setText( %value );
  196. PE_ParticleEditor-->PEP_lifetimeVarianceMS_slider.setValue( %value );
  197. }
  198. }
  199. // Submit undo.
  200. %last = Editor.getUndoManager().getUndoAction(Editor.getUndoManager().getUndoCount() - 1);
  201. if( (%isSlider) && (%last.isSlider) && (!%last.onMouseUp) )
  202. {
  203. %last.isSlider = %isSlider;
  204. %last.onMouseUp = %onMouseUp;
  205. %last.newValueLifetimeMS = PE_ParticleEditor-->PEP_lifetimeMS_textEdit.getText();
  206. %last.newValueLifetimeVarianceMS = PE_ParticleEditor-->PEP_lifetimeVarianceMS_textEdit.getText();
  207. }
  208. else
  209. {
  210. %action = ParticleEditor.createUndo(ActionUpdateActiveParticleLifeFields, "Update Active Particle");
  211. %action.particle = %particle;
  212. %action.isSlider = %isSlider;
  213. %action.onMouseUp = %onMouseUp;
  214. %action.newValueLifetimeMS = PE_ParticleEditor-->PEP_lifetimeMS_textEdit.getText();
  215. %action.oldValueLifetimeMS = %particle.lifetimeMS;
  216. %action.newValueLifetimeVarianceMS = PE_ParticleEditor-->PEP_lifetimeVarianceMS_textEdit.getText();
  217. %action.oldValueLifetimeVarianceMS = %particle.lifetimeVarianceMS;
  218. ParticleEditor.submitUndo( %action );
  219. }
  220. %particle.lifetimeMS = PE_ParticleEditor-->PEP_lifetimeMS_textEdit.getText();
  221. %particle.lifetimeVarianceMS = PE_ParticleEditor-->PEP_lifetimeVarianceMS_textEdit.getText();
  222. %particle.reload();
  223. }
  224. //---------------------------------------------------------------------------------------------
  225. function PE_ParticleEditor::updateSpinFields( %this, %isMax, %value, %isSlider, %onMouseUp )
  226. {
  227. PE_ParticleEditor.setParticleDirty();
  228. %particle = PE_ParticleEditor.currParticle;
  229. // Transfer values over to gui controls.
  230. if( %isMax )
  231. {
  232. %value ++;
  233. if( %value > PE_ParticleEditor-->PEP_spinRandomMax_slider.getValue() )
  234. {
  235. PE_ParticleEditor-->PEP_spinRandomMax_textEdit.setText( %value );
  236. PE_ParticleEditor-->PEP_spinRandomMax_slider.setValue( %value );
  237. }
  238. }
  239. else
  240. {
  241. %value --;
  242. if( %value < PE_ParticleEditor-->PEP_spinRandomMin_slider.getValue() )
  243. {
  244. PE_ParticleEditor-->PEP_spinRandomMin_textEdit.setText( %value );
  245. PE_ParticleEditor-->PEP_spinRandomMin_slider.setValue( %value );
  246. }
  247. }
  248. // Submit undo.
  249. %last = Editor.getUndoManager().getUndoAction(Editor.getUndoManager().getUndoCount() - 1);
  250. if( (%isSlider) && (%last.isSlider) && (!%last.onMouseUp) )
  251. {
  252. %last.isSlider = %isSlider;
  253. %last.onMouseUp = %onMouseUp;
  254. %last.newValueSpinRandomMax = PE_ParticleEditor-->PEP_spinRandomMax_textEdit.getText();
  255. %last.newValueSpinRandomMin = PE_ParticleEditor-->PEP_spinRandomMin_textEdit.getText();
  256. }
  257. else
  258. {
  259. %action = ParticleEditor.createUndo(ActionUpdateActiveParticleSpinFields, "Update Active Particle");
  260. %action.particle = %particle;
  261. %action.isSlider = %isSlider;
  262. %action.onMouseUp = %onMouseUp;
  263. %action.newValueSpinRandomMax = PE_ParticleEditor-->PEP_spinRandomMax_textEdit.getText();
  264. %action.oldValueSpinRandomMax = %particle.spinRandomMax;
  265. %action.newValueSpinRandomMin = PE_ParticleEditor-->PEP_spinRandomMin_textEdit.getText();
  266. %action.oldValueSpinRandomMin = %particle.spinRandomMin;
  267. ParticleEditor.submitUndo( %action );
  268. }
  269. %particle.spinRandomMax = PE_ParticleEditor-->PEP_spinRandomMax_textEdit.getText();
  270. %particle.spinRandomMin = PE_ParticleEditor-->PEP_spinRandomMin_textEdit.getText();
  271. %particle.reload();
  272. }
  273. //---------------------------------------------------------------------------------------------
  274. function PE_ParticleEditor::onNewParticle( %this )
  275. {
  276. // Bail if the user selected the same particle.
  277. %id = PEP_ParticleSelector.getSelected();
  278. if( %id == PE_ParticleEditor.currParticle )
  279. return;
  280. // Load new particle if we're not in a dirty state
  281. if( PE_ParticleEditor.dirty )
  282. {
  283. toolsMessageBoxYesNoCancel("Save Existing Particle?",
  284. "Do you want to save changes to <br><br>" @ PE_ParticleEditor.currParticle.getName(),
  285. "PE_ParticleEditor.saveParticle(" @ PE_ParticleEditor.currParticle @ ");",
  286. "PE_ParticleEditor.saveParticleDialogDontSave(" @ PE_ParticleEditor.currParticle @ "); PE_ParticleEditor.loadNewParticle();"
  287. );
  288. }
  289. else
  290. {
  291. PE_ParticleEditor.loadNewParticle();
  292. }
  293. }
  294. //---------------------------------------------------------------------------------------------
  295. function PE_ParticleEditor::loadNewParticle( %this, %particle )
  296. {
  297. if( isObject( %particle ) )
  298. %particle = %particle.getId();
  299. else
  300. %particle = PEP_ParticleSelector.getSelected();
  301. if( !isObject( %particle ) )
  302. return;
  303. PE_ParticleEditor.currParticle = %particle;
  304. error("PE_ParticleEditor::loadNewParticle() - Loading particle: " @ %particle.getName());
  305. error("Particle TextureName: " @ %particle.getTexture());
  306. error("ReloadingParticle...");
  307. %particle.reload();
  308. PE_ParticleEditor_NotDirtyParticle.assignFieldsFrom( %particle );
  309. PE_ParticleEditor_NotDirtyParticle.originalName = %particle.getName();
  310. error("Post duplicate Particle TextureName: " @ %particle.getTexture());
  311. error("Post duplicate PE_ParticleEditor_NotDirtyParticle TextureName: " @ PE_ParticleEditor_NotDirtyParticle.getTexture());
  312. PE_ParticleEditor.guiSync();
  313. PE_ParticleEditor.setParticleNotDirty();
  314. }
  315. //---------------------------------------------------------------------------------------------
  316. function PE_ParticleEditor::setParticleDirty( %this )
  317. {
  318. PE_ParticleEditor.text = "Particle *";
  319. PE_ParticleEditor.dirty = true;
  320. %particle = PE_ParticleEditor.currParticle;
  321. %filename = %particle.getFilename();
  322. %editorFilename = "tools/particleEditor/particleParticleEditor.ed." @ $TorqueScriptFileExtension;
  323. if( %filename $= "" || %filename $= %editorFilename )
  324. PE_ParticleSaver.setDirty( %particle, $PE_PARTICLEEDITOR_DEFAULT_FILENAME );
  325. else
  326. PE_ParticleSaver.setDirty( %particle );
  327. }
  328. //---------------------------------------------------------------------------------------------
  329. function PE_ParticleEditor::setParticleNotDirty( %this )
  330. {
  331. PE_ParticleEditor.text = "Particle";
  332. PE_ParticleEditor.dirty = false;
  333. PE_ParticleSaver.clearAll();
  334. }
  335. //---------------------------------------------------------------------------------------------
  336. function PE_ParticleEditor::showNewDialog( %this, %replaceSlot )
  337. {
  338. // Open a dialog if the current Particle is dirty
  339. if( PE_ParticleEditor.dirty )
  340. {
  341. toolsMessageBoxYesNoCancel("Save Particle Changes?",
  342. "Do you wish to save the changes made to the <br>current particle before changing the particle?",
  343. "PE_ParticleEditor.saveParticle( " @ PE_ParticleEditor.currParticle.getName() @ " ); PE_ParticleEditor.createParticle( " @ %replaceSlot @ " );",
  344. "PE_ParticleEditor.saveParticleDialogDontSave( " @ PE_ParticleEditor.currParticle.getName() @ " ); PE_ParticleEditor.createParticle( " @ %replaceSlot @ " );"
  345. );
  346. }
  347. else
  348. {
  349. PE_ParticleEditor.createParticle( %replaceSlot );
  350. }
  351. }
  352. //---------------------------------------------------------------------------------------------
  353. function PE_ParticleEditor::createParticle( %this, %replaceSlot )
  354. {
  355. // Make sure we have a spare slot on the current emitter.
  356. if( !%replaceSlot )
  357. {
  358. %numExistingParticles = getWordCount( PE_EmitterEditor.currEmitter.particles );
  359. if( %numExistingParticles > 3 )
  360. {
  361. toolsMessageBoxOK( "Error", "An emitter cannot have more than 4 particles assigned to it." );
  362. return;
  363. }
  364. %particleIndex = %numExistingParticles;
  365. }
  366. else
  367. %particleIndex = %replaceSlot - 1;
  368. PE_ParticleEditor.newParticleSlot = %particleIndex;
  369. if(%replaceSlot $= "" || %replaceSlot != 0)
  370. {
  371. AssetBrowser_SelectModule.showDialog("PE_ParticleEditor.pickedNewParticleTargetModule");
  372. AssetBrowser_SelectModuleWindow.selectWindow();
  373. }
  374. else
  375. {
  376. PE_ParticleEditor.pickedNewParticleTargetModule(PE_EmitterEditor.targetModule);
  377. }
  378. }
  379. function PE_ParticleEditor::pickedNewParticleTargetModule(%this, %module)
  380. {
  381. %moduleDef = ModuleDatabase.findModule(%module);
  382. $PE_PARTICLEEDITOR_DEFAULT_FILENAME = %moduleDef.ModulePath @ "/scripts/managedData/managedParticleData." @ $TorqueScriptFileExtension;
  383. if(!isDirectory(filePath($PE_PARTICLEEDITOR_DEFAULT_FILENAME)))
  384. {
  385. AssetBrowser.dirHandler.createFolder(filePath($PE_PARTICLEEDITOR_DEFAULT_FILENAME));
  386. }
  387. // Create the particle datablock and add to the emitter.
  388. %newParticle = getUniqueName( "newParticle" );
  389. datablock ParticleData( %newParticle : DefaultParticle )
  390. {
  391. };
  392. // Submit undo.
  393. %action = ParticleEditor.createUndo( ActionCreateNewParticle, "Create New Particle" );
  394. %action.particle = %newParticle.getId();
  395. %action.particleIndex = PE_ParticleEditor.newParticleSlot;
  396. %action.prevParticle = ( "PEE_EmitterParticleSelector" @ ( PE_ParticleEditor.newParticleSlot + 1 ) ).getSelected();
  397. %action.emitter = PE_EmitterEditor.currEmitter;
  398. ParticleEditor.submitUndo( %action );
  399. // Execute action.
  400. %action.redo();
  401. }
  402. //---------------------------------------------------------------------------------------------
  403. function PE_ParticleEditor::showDeleteDialog( %this )
  404. {
  405. // Don't allow deleting DefaultParticle.
  406. if( PE_ParticleEditor.currParticle.getName() $= "DefaultParticle" )
  407. {
  408. toolsMessageBoxOK( "Error", "Cannot delete DefaultParticle");
  409. return;
  410. }
  411. // Check to see if the particle emitter has more than 1 particle on it.
  412. if( getWordCount( PE_EmitterEditor.currEmitter.particles ) == 1 )
  413. {
  414. toolsMessageBoxOK( "Error", "At least one particle must remain on the particle emitter.");
  415. return;
  416. }
  417. // Bring up requester for confirmation.
  418. if( isObject( PE_ParticleEditor.currParticle ) )
  419. {
  420. toolsMessageBoxYesNoCancel( "Delete Particle?",
  421. "Are you sure you want to delete<br><br>" @ PE_ParticleEditor.currParticle.getName() @ "<br><br> Particle deletion won't take affect until the engine is quit.",
  422. "PE_ParticleEditor.saveParticleDialogDontSave( " @ PE_ParticleEditor.currParticle.getName() @ " ); PE_ParticleEditor.deleteParticle();",
  423. "",
  424. ""
  425. );
  426. }
  427. }
  428. //---------------------------------------------------------------------------------------------
  429. function PE_ParticleEditor::deleteParticle( %this )
  430. {
  431. %particle = PE_ParticleEditor.currParticle;
  432. // Submit undo.
  433. %action = ParticleEditor.createUndo( ActionDeleteParticle, "Delete Particle" );
  434. %action.particle = %particle;
  435. %action.emitter = PE_EmitterEditor.currEmitter;
  436. ParticleEditor.submitUndo( %action );
  437. // Execute action.
  438. %action.redo();
  439. }
  440. //---------------------------------------------------------------------------------------------
  441. function PE_ParticleEditor::saveParticle( %this, %particle )
  442. {
  443. %particle.setName( PEP_ParticleSelector.getText() );
  444. PE_ParticleEditor_NotDirtyParticle.assignFieldsFrom( %particle );
  445. PE_ParticleEditor_NotDirtyParticle.originalName = %particle.getName();
  446. PE_ParticleSaver.saveDirty();
  447. PE_ParticleEditor.setParticleNotDirty();
  448. ParticleEditor.createParticleList();
  449. }
  450. //---------------------------------------------------------------------------------------------
  451. function PE_ParticleEditor::saveParticleDialogDontSave( %this, %particle )
  452. {
  453. %particle.setName( PE_ParticleEditor_NotDirtyParticle.originalName );
  454. %particle.assignFieldsFrom( PE_ParticleEditor_NotDirtyParticle );
  455. PE_ParticleEditor.setParticleNotDirty();
  456. }
  457. //=============================================================================================
  458. // PE_ColorTintSwatch.
  459. //=============================================================================================
  460. //---------------------------------------------------------------------------------------------
  461. function PE_ColorTintSwatch::updateParticleColor( %this, %color )
  462. {
  463. %arrayNum = %this.arrayNum;
  464. %r = getWord( %color, 0 );
  465. %g = getWord( %color, 1 );
  466. %b = getWord( %color, 2 );
  467. %a = getWord( %color, 3 );
  468. %color = %r SPC %g SPC %b SPC %a;
  469. %this.color = %color;
  470. PE_ParticleEditor.updateParticle( "colors[" @ %arrayNum @ "]", %color );
  471. }
  472. //=============================================================================================
  473. // PEP_ParticleSelector_Control.
  474. //=============================================================================================
  475. //---------------------------------------------------------------------------------------------
  476. function PEP_ParticleSelector_Control::onRenameItem( %this )
  477. {
  478. Parent::onRenameItem( %this );
  479. //FIXME: need to check for validity of name and name clashes
  480. PE_ParticleEditor.setParticleDirty();
  481. // Resort menu.
  482. %this-->PopupMenu.sort();
  483. }
  484. //=============================================================================================
  485. // PEP_NewParticleButton.
  486. //=============================================================================================
  487. //---------------------------------------------------------------------------------------------
  488. function PEP_NewParticleButton::onDefaultClick( %this )
  489. {
  490. PE_ParticleEditor.showNewDialog();
  491. }
  492. //---------------------------------------------------------------------------------------------
  493. function PEP_NewParticleButton::onCtrlClick( %this )
  494. {
  495. for( %i = 1; %i < 5; %i ++ )
  496. {
  497. %popup = "PEE_EmitterParticleSelector" @ %i;
  498. if( %popup.getSelected() == PEP_ParticleSelector.getSelected() )
  499. {
  500. %replaceSlot = %i;
  501. break;
  502. }
  503. }
  504. PE_ParticleEditor.showNewDialog( %replaceSlot );
  505. }