home *** CD-ROM | disk | FTP | other *** search
/ 3D Game Programming All in One / 3D Game Programming All in One Disc.iso / 3D2E / RESOURCES / CH10 / creator / editor / particleEditor.cs < prev    next >
Encoding:
Text File  |  2005-11-23  |  15.7 KB  |  369 lines

  1. // The Particle Editor!
  2. // Edits both emitters and their particles in realtime in game.
  3. // 
  4. // Open the particle editor to spawn a test emitter in front of the player.
  5. // Edit the sliders, check boxes, and text fields and see the results in
  6. // realtime.  Switch between emitters and particles with the buttons in the
  7. // top left corner.  When in particle mode, the only particles available will
  8. // be those assigned to the current emitter to avoid confusion.  In the top
  9. // right corner, there is a button marked "Drop Emitter", which will spawn the
  10. // test emitter in front of the player again, and a button marked "Restart
  11. // Emitter", which will play the particle animation again.
  12.  
  13. //TODO: animTexName on Particles (max 50)
  14.  
  15. function toggleParticleEditor(%val)
  16. {
  17.    if (!%val)
  18.       return;
  19.  
  20.    if ($ParticleEditor::isOpen)
  21.    {
  22.       Canvas.popDialog(ParticleEditor);
  23.       $ParticleEditor::isOpen = false;
  24.       return;
  25.    }
  26.  
  27.    if (!isObject(ParticleEditor))
  28.    {
  29.       exec("common/editor/ParticleEditor.gui");
  30.       ParticleEditor.initEditor();
  31.    }
  32.    ParticleEditor.startup();
  33.  
  34.    Canvas.pushDialog(ParticleEditor);
  35.    $ParticleEditor::isOpen = true;
  36. }
  37.  
  38.  
  39. function ParticleEditor::startup(%this)
  40. {
  41.    $ParticleEditor::activeEditor.updateControls();
  42.    if (!isObject($ParticleEditor::emitterNode))
  43.       %this.resetEmitterNode();
  44. }
  45.  
  46. function ParticleEditor::initEditor(%this)
  47. {
  48.    echo("Initializing ParticleEmitterData and ParticleData DataBlocks...");
  49.  
  50.    %count = DatablockGroup.getCount();
  51.    %emitterCount = 0;
  52.    %particleCount = 0;
  53.  
  54.    PEE_EmitterSelector.clear();
  55.    PEE_EmitterParticleSelector1.clear();
  56.    PEE_EmitterParticleSelector2.clear();
  57.    PEE_EmitterParticleSelector3.clear();
  58.    PEE_EmitterParticleSelector4.clear();
  59.    PEP_ParticleSelector.clear();
  60.    for (%i = 0; %i < %count; %i++)
  61.    {
  62.       %obj = DatablockGroup.getObject(%i);
  63.       if (%obj.getClassName() $= "ParticleEmitterData")
  64.       {
  65.          PEE_EmitterSelector.add(%obj.getName(), %emitterCount);
  66.          %emitterCount++;
  67.       }
  68.       if (%obj.getClassName() $= "ParticleData")
  69.       {
  70.          PEE_EmitterParticleSelector1.add(%obj.getName(), %particleCount);
  71.          PEE_EmitterParticleSelector2.add(%obj.getName(), %particleCount);
  72.          PEE_EmitterParticleSelector3.add(%obj.getName(), %particleCount);
  73.          PEE_EmitterParticleSelector4.add(%obj.getName(), %particleCount);
  74.          %particleCount++;
  75.       }
  76.    }
  77.    PEE_EmitterParticleSelector2.add("", %particleCount); //insert a blank space
  78.    PEE_EmitterParticleSelector3.add("", %particleCount); //insert a blank space
  79.    PEE_EmitterParticleSelector4.add("", %particleCount); //insert a blank space
  80.  
  81.    echo("Found" SPC %emitterCount SPC "emitters and" SPC %particleCount SPC "particles.");
  82.  
  83.    PEE_EmitterSelector.sort();
  84.    PEE_EmitterParticleSelector1.sort();
  85.    PEE_EmitterParticleSelector2.sort();
  86.    PEE_EmitterParticleSelector3.sort();
  87.    PEE_EmitterParticleSelector4.sort();
  88.  
  89.    PEE_EmitterSelector.setSelected(0);
  90.  
  91.    %this.openEmitterPane();
  92.  }
  93.  
  94. function PE_EmitterEditor::updateControls(%this)
  95. {
  96.    %id = PEE_EmitterSelector.getSelected();
  97.    %data = PEE_EmitterSelector.getTextById(%id);
  98.  
  99.    PEE_ejectionPeriodMS.setValue(   %data.ejectionPeriodMS);
  100.    PEE_periodVarianceMS.setValue(   %data.periodVarianceMS);
  101.    PEE_ejectionVelocity.setValue(   %data.ejectionVelocity);
  102.    PEE_velocityVariance.setValue(   %data.velocityVariance);
  103.    PEE_ejectionOffset.setValue(     %data.ejectionOffset);
  104.    PEE_lifetimeMS.setValue(         %data.lifetimeMS);
  105.    PEE_lifetimeVarianceMS.setValue( %data.lifetimeVarianceMS);
  106.    PEE_thetaMin.setValue(           %data.thetaMin);
  107.    PEE_thetaMax.setValue(           %data.thetaMax);
  108.    PEE_phiReferenceVel.setValue(    %data.phiReferenceVel);
  109.    PEE_phiVariance.setValue(        %data.phiVariance);
  110.    PEE_overrideAdvance.setValue(    %data.overrideAdvance);
  111.    PEE_orientParticles.setValue(    %data.orientParticles);
  112.    PEE_orientOnVelocity.setValue(   %data.orientOnVelocity);
  113.    PEE_useEmitterSizes.setValue(    %data.useEmitterSizes);
  114.    PEE_useEmitterColors.setValue(   %data.useEmitterColors);
  115.  
  116.    PEE_EmitterParticleSelector1.setText(getField(%data.particles, 0));
  117.    PEE_EmitterParticleSelector2.setText(getField(%data.particles, 1));
  118.    PEE_EmitterParticleSelector3.setText(getField(%data.particles, 2));
  119.    PEE_EmitterParticleSelector4.setText(getField(%data.particles, 3));
  120.  
  121.    $ParticleEditor::currEmitter = %data;
  122. }
  123.  
  124. function PE_ParticleEditor::updateControls(%this)
  125. {
  126.    %id = PEP_ParticleSelector.getSelected();
  127.    %data = PEP_ParticleSelector.getTextById(%id);
  128.  
  129.    PEP_dragCoefficient.setValue(     %data.dragCoefficient);
  130.    PEP_windCoefficient.setValue(     %data.windCoefficient);
  131.    PEP_gravityCoefficient.setValue(  %data.gravityCoefficient);
  132.    PEP_inheritedVelFactor.setValue(  %data.inheritedVelFactor);
  133.    PEP_constantAcceleration.setValue(%data.constantAcceleration);
  134.    PEP_lifetimeMS.setValue(          %data.lifetimeMS);
  135.    PEP_lifetimeVarianceMS.setValue(  %data.lifetimeVarianceMS);
  136.    PEP_spinSpeed.setValue(           %data.spinSpeed);
  137.    PEP_spinRandomMin.setValue(       %data.spinRandomMin);
  138.    PEP_framesPerSec.setValue(        %data.framesPerSec);
  139.    PEP_spinRandomMax.setValue(       %data.spinRandomMax);
  140.    PEP_useInvAlpha.setValue(         %data.useInvAlpha);
  141.    PEP_animateTexture.setValue(      %data.animateTexture);
  142.    PEP_times0.setText(               %data.times[0]);
  143.    PEP_times1.setText(               %data.times[1]);
  144.    PEP_times2.setText(               %data.times[2]);
  145.    PEP_times3.setText(               %data.times[3]);
  146.    PEP_sizes0.setText(               %data.sizes[0]);
  147.    PEP_sizes1.setText(               %data.sizes[1]);
  148.    PEP_sizes2.setText(               %data.sizes[2]);
  149.    PEP_sizes3.setText(               %data.sizes[3]);
  150.    PEP_colors0.setText(              %data.colors[0]);
  151.    PEP_colors1.setText(              %data.colors[1]);
  152.    PEP_colors2.setText(              %data.colors[2]);
  153.    PEP_colors3.setText(              %data.colors[3]);
  154.    PEP_textureName.setText(          %data.textureName);
  155.  
  156.    $ParticleEditor::currParticle =   %data;
  157. }
  158.  
  159. function ParticleEditor::openEmitterPane(%this)
  160. {
  161.    PE_Window.setText("Particle Editor - Emitters");
  162.    PE_EmitterEditor.setVisible(true);
  163.    PE_EmitterButton.setActive(false);
  164.    PE_ParticleEditor.setVisible(false);
  165.    PE_ParticleButton.setActive(true);
  166.    PE_EmitterEditor.updateControls();
  167.    $ParticleEditor::activeEditor = PE_EmitterEditor;
  168. }
  169.  
  170. function ParticleEditor::openParticlePane(%this)
  171. {
  172.    PE_Window.setText("Particle Editor - Particles");
  173.    PE_EmitterEditor.setVisible(false);
  174.    PE_EmitterButton.setActive(true);
  175.    PE_ParticleEditor.setVisible(true);
  176.    PE_ParticleButton.setActive(false);
  177.  
  178.    PEP_ParticleSelector.clear();
  179.    PEP_ParticleSelector.add(PEE_EmitterParticleSelector1.getText(), 0);
  180.    %count = 1;
  181.    if (PEE_EmitterParticleSelector2.getText() !$= "")
  182.    {
  183.       PEP_ParticleSelector.add(PEE_EmitterParticleSelector2.getText(), %count);
  184.       %count++;
  185.    }
  186.    if (PEE_EmitterParticleSelector3.getText() !$= "")
  187.    {
  188.       PEP_ParticleSelector.add(PEE_EmitterParticleSelector3.getText(), %count);
  189.       %count++;
  190.    }
  191.    if (PEE_EmitterParticleSelector4.getText() !$= "")
  192.       PEP_ParticleSelector.add(PEE_EmitterParticleSelector4.getText(), %count);
  193.  
  194.    PEP_ParticleSelector.sort();
  195.    PEP_ParticleSelector.setSelected(0);   //select the PEE_EmitterParticleSelector1 particle
  196.  
  197.    PE_ParticleEditor.updateControls();
  198.    $ParticleEditor::activeEditor = PE_ParticleEditor;
  199. }
  200.  
  201. function PE_EmitterEditor::updateEmitter(%this)
  202. {
  203.    $ParticleEditor::currEmitter.ejectionPeriodMS = PEE_ejectionPeriodMS.getValue();
  204.    $ParticleEditor::currEmitter.periodVarianceMS = PEE_periodVarianceMS.getValue();
  205.    if ($ParticleEditor::currEmitter.periodVarianceMS >= $ParticleEditor::currEmitter.ejectionPeriodMS)
  206.    {
  207.       $ParticleEditor::currEmitter.periodVarianceMS = $ParticleEditor::currEmitter.ejectionPeriodMS - 1;
  208.       PEE_periodVarianceMS.setValue($ParticleEditor::currEmitter.periodVarianceMS);
  209.    }
  210.    $ParticleEditor::currEmitter.ejectionVelocity   = PEE_ejectionVelocity.getValue();
  211.    $ParticleEditor::currEmitter.velocityVariance   = PEE_velocityVariance.getValue();
  212.    if ($ParticleEditor::currEmitter.velocityVariance >= $ParticleEditor::currEmitter.ejectionVelocity)
  213.    {
  214.       $ParticleEditor::currEmitter.velocityVariance = $ParticleEditor::currEmitter.ejectionVelocity - 0.01;
  215.       if ($ParticleEditor::currEmitter.velocityVariance < 0)
  216.          $ParticleEditor::currEmitter.velocityVariance = 0;
  217.       PEE_velocityVariance.setValue($ParticleEditor::currEmitter.velocityVariance);
  218.    }
  219.    $ParticleEditor::currEmitter.ejectionOffset     = PEE_ejectionOffset.getValue();
  220.    $ParticleEditor::currEmitter.lifetimeMS         = PEE_lifetimeMS.getValue();
  221.    $ParticleEditor::currEmitter.lifetimeVarianceMS = PEE_lifetimeVarianceMS.getValue();
  222.    if ($ParticleEditor::currEmitter.lifetimeMS == 0)
  223.    {
  224.       $ParticleEditor::currEmitter.lifetimeVarianceMS = 0;
  225.       PEE_lifetimeVarianceMS.setValue($ParticleEditor::currEmitter.lifetimeVarianceMS);
  226.    }
  227.    else if ($ParticleEditor::currEmitter.lifetimeVarianceMS >= $ParticleEditor::currEmitter.lifetimeMS)
  228.    {
  229.       $ParticleEditor::currEmitter.lifetimeVarianceMS = $ParticleEditor::currEmitter.lifetimeMS - 1;
  230.       PEE_lifetimeVarianceMS.setValue($ParticleEditor::currEmitter.lifetimeVarianceMS);
  231.    }
  232.    $ParticleEditor::currEmitter.thetaMin           = PEE_thetaMin.getValue();
  233.    $ParticleEditor::currEmitter.thetaMax           = PEE_thetaMax.getValue();
  234.    $ParticleEditor::currEmitter.phiReferenceVel    = PEE_phiReferenceVel.getValue();
  235.    $ParticleEditor::currEmitter.phiVariance        = PEE_phiVariance.getValue();
  236.    $ParticleEditor::currEmitter.overrideAdvance    = PEE_overrideAdvance.getValue();
  237.    $ParticleEditor::currEmitter.orientParticles    = PEE_orientParticles.getValue();
  238.    $ParticleEditor::currEmitter.orientOnVelocity   = PEE_orientOnVelocity.getValue();
  239.    $ParticleEditor::currEmitter.useEmitterSizes    = PEE_useEmitterSizes.getValue();
  240.    $ParticleEditor::currEmitter.useEmitterColors   = PEE_useEmitterColors.getValue();
  241.    $ParticleEditor::currEmitter.particles          = PEE_EmitterParticleSelector1.getText();
  242.  
  243.    if (PEE_EmitterParticleSelector2.getText() !$= "")
  244.       $ParticleEditor::currEmitter.particles = $ParticleEditor::currEmitter.particles TAB PEE_EmitterParticleSelector2.getText();
  245.    if (PEE_EmitterParticleSelector3.getText() !$= "")
  246.       $ParticleEditor::currEmitter.particles = $ParticleEditor::currEmitter.particles TAB PEE_EmitterParticleSelector3.getText();
  247.    if (PEE_EmitterParticleSelector4.getText() !$= "")
  248.       $ParticleEditor::currEmitter.particles = $ParticleEditor::currEmitter.particles TAB PEE_EmitterParticleSelector4.getText();
  249.  
  250.    $ParticleEditor::currEmitter.reload();                        
  251. }
  252.  
  253. function PE_ParticleEditor::updateParticle(%this)
  254. {
  255.    $ParticleEditor::currParticle.dragCoefficient      = PEP_dragCoefficient.getValue();
  256.    $ParticleEditor::currParticle.windCoefficient      = PEP_windCoefficient.getValue();
  257.    $ParticleEditor::currParticle.gravityCoefficient   = PEP_gravityCoefficient.getValue();
  258.    $ParticleEditor::currParticle.inheritedVelFactor   = PEP_inheritedVelFactor.getValue();
  259.    $ParticleEditor::currParticle.constantAcceleration = PEP_constantAcceleration.getValue();
  260.    $ParticleEditor::currParticle.lifetimeMS           = PEP_lifetimeMS.getValue();
  261.    $ParticleEditor::currParticle.lifetimeVarianceMS   = PEP_lifetimeVarianceMS.getValue();
  262.    if ($ParticleEditor::currParticle.lifetimeVarianceMS >= $ParticleEditor::currParticle.lifetimeMS)
  263.    {
  264.       $ParticleEditor::currParticle.lifetimeVarianceMS = $ParticleEditor::currParticle.lifetimeMS - 1;
  265.       PEP_lifetimeVarianceMS.setValue($ParticleEditor::currParticle.lifetimeVarianceMS);
  266.    }
  267.    $ParticleEditor::currParticle.spinSpeed            = PEP_spinSpeed.getValue();
  268.    $ParticleEditor::currParticle.spinRandomMin        = PEP_spinRandomMin.getValue();
  269.    $ParticleEditor::currParticle.spinRandomMax        = PEP_spinRandomMax.getValue();
  270.    $ParticleEditor::currParticle.framesPerSec         = PEP_framesPerSec.getValue();
  271.    $ParticleEditor::currParticle.useInvAlpha          = PEP_useInvAlpha.getValue();
  272.    $ParticleEditor::currParticle.animateTexture       = PEP_animateTexture.getValue();
  273.  
  274.    $ParticleEditor::currParticle.times[0]             = PEP_times0.getValue();
  275.    $ParticleEditor::currParticle.times[1]             = PEP_times1.getValue();
  276.    $ParticleEditor::currParticle.times[2]             = PEP_times2.getValue();
  277.    $ParticleEditor::currParticle.times[3]             = PEP_times3.getValue();
  278.    $ParticleEditor::currParticle.sizes[0]             = PEP_sizes0.getValue();
  279.    $ParticleEditor::currParticle.sizes[1]             = PEP_sizes1.getValue();
  280.    $ParticleEditor::currParticle.sizes[2]             = PEP_sizes2.getValue();
  281.    $ParticleEditor::currParticle.sizes[3]             = PEP_sizes3.getValue();
  282.    $ParticleEditor::currParticle.colors[0]            = PEP_colors0.getValue();
  283.    $ParticleEditor::currParticle.colors[1]            = PEP_colors1.getValue();
  284.    $ParticleEditor::currParticle.colors[2]            = PEP_colors2.getValue();
  285.    $ParticleEditor::currParticle.colors[3]            = PEP_colors3.getValue();
  286.  
  287.    $ParticleEditor::currParticle.textureName          = PEP_textureName.getValue();
  288.  
  289.    $ParticleEditor::currParticle.reload();                        
  290. }
  291.  
  292. function PE_EmitterEditor::onNewEmitter(%this)
  293. {
  294.    ParticleEditor.updateEmitterNode();
  295.    PE_EmitterEditor.updateControls();
  296. }
  297.  
  298. function PE_ParticleEditor::onNewParticle(%this)
  299. {
  300.    PE_ParticleEditor.updateControls();
  301. }
  302.  
  303. function ParticleEditor::resetEmitterNode(%this)
  304. {
  305.    %tform = ServerConnection.getControlObject().getEyeTransform();
  306.    %vec = VectorNormalize(ServerConnection.getControlObject().getForwardVector());
  307.    %vec = VectorScale(%vec, 4);
  308.    %tform = setWord(%tform, 0, getWord(%tform, 0) + getWord(%vec, 0));
  309.    %tform = setWord(%tform, 1, getWord(%tform, 1) + getWord(%vec, 1));
  310.    %tform = setWord(%tform, 2, getWord(%tform, 2) + getWord(%vec, 2));
  311.  
  312.    if (!isObject($ParticleEditor::emitterNode))
  313.    {
  314.       if (!isObject(TestEmitterNodeData))
  315.       {
  316.          datablock ParticleEmitterNodeData(TestEmitterNodeData)
  317.          {
  318.             timeMultiple = 1;
  319.          };
  320.       }
  321.  
  322.       $ParticleEditor::emitterNode = new ParticleEmitterNode()
  323.       {
  324.          emitter = PEE_EmitterSelector.getText();
  325.          velocity = 1;
  326.          position = getWords(%tform, 0, 2);
  327.          rotation = getWords(%tform, 3, 6);
  328.          datablock = TestEmitterNodeData;
  329.       };
  330.       //grab the client-side emitter node so we can reload the emitter datablock
  331.       $ParticleEditor::clientEmitterNode = $ParticleEditor::emitterNode+1;
  332.    }
  333.    else
  334.    {
  335.       $ParticleEditor::clientEmitterNode.setTransform(%tform);
  336.       ParticleEditor.updateEmitterNode();
  337.    }
  338. }
  339.  
  340. function ParticleEditor::updateEmitterNode()
  341. {
  342.    $ParticleEditor::clientEmitterNode.setEmitterDataBlock(PEE_EmitterSelector.getText().getId());
  343. }
  344.  
  345. function PE_EmitterEditor::save(%this)
  346. {
  347.    %mod = $currentMod;
  348.    if (%mod $= "")
  349.    {
  350.       warn("Warning: No mod detected, saving in common.");
  351.       %mod = "common";
  352.    }
  353.    %filename = %mod @ "/" @ $ParticleEditor::currEmitter @ ".cs";
  354.    $ParticleEditor::currEmitter.save(%filename);
  355. }
  356.  
  357. function PE_ParticleEditor::save(%this)
  358. {
  359.    %mod = $currentMod;
  360.    if (%mod $= "")
  361.    {
  362.       warn("Warning: No mod detected, saving in common.");
  363.       %mod = "common";
  364.    }
  365.    %filename = %mod @ "/" @ $ParticleEditor::currParticle @ ".cs";
  366.    $ParticleEditor::currParticle.save(%filename);
  367. }
  368.  
  369.