Brownian Motion

This example simulates Brownian Motion. It demonstrates Flint’s built-in collision handling between particles.

The example also includes a custom action created to show and hide the air particles.

package
{
  import org.flintparticles.threeD.emitters.Emitter3D;
  import org.flintparticles.threeD.renderers.DisplayObjectRenderer;
  import org.flintparticles.threeD.renderers.controllers.OrbitCamera;

  import flash.display.Sprite;
  import flash.geom.Vector3D;

  [SWF(width='400', height='400', frameRate='60', backgroundColor='#000000')]
  
  public class Main extends Sprite
  {
    private var emitter:Emitter3D;
    private var orbitter:OrbitCamera;
    
    public function Main()
    {
      emitter = new BrownianMotion( stage );

      var renderer:DisplayObjectRenderer = new DisplayObjectRenderer();
      renderer.x = 200;
      renderer.y = 200;
      renderer.addEmitter( emitter );
      addChild( renderer );
      
      renderer.camera.position = new Vector3D( 0, 0, -400 );
      renderer.camera.target = new Vector3D( 0, 0, 0 );
      renderer.camera.projectionDistance = 400;
      orbitter = new OrbitCamera( stage, renderer.camera );
      orbitter.start();

      emitter.start();
    }
  }
}
package
{
  import org.flintparticles.common.counters.Blast;
  import org.flintparticles.common.displayObjects.Dot;
  import org.flintparticles.common.initializers.ChooseInitializer;
  import org.flintparticles.common.initializers.CollisionRadiusInit;
  import org.flintparticles.common.initializers.ColorInit;
  import org.flintparticles.common.initializers.ImageClass;
  import org.flintparticles.common.initializers.InitializerGroup;
  import org.flintparticles.common.initializers.MassInit;
  import org.flintparticles.threeD.actions.BoundingBox;
  import org.flintparticles.threeD.actions.Collide;
  import org.flintparticles.threeD.actions.Move;
  import org.flintparticles.threeD.emitters.Emitter3D;
  import org.flintparticles.threeD.initializers.Position;
  import org.flintparticles.threeD.initializers.Velocity;
  import org.flintparticles.threeD.zones.BoxZone;
  import org.flintparticles.threeD.zones.SphereZone;

  import flash.display.DisplayObject;
  import flash.geom.Vector3D;

  public class BrownianMotion extends Emitter3D
  {
    public function BrownianMotion( stage:DisplayObject )
    {
      counter = new Blast( 400 );
      
      var air:InitializerGroup = new InitializerGroup();
      air.addInitializer( new ImageClass( Dot, [2] ) );
      air.addInitializer( new ColorInit( 0xFF666666, 0xFF666666 ) );
      air.addInitializer( new MassInit( 1 ) );
      air.addInitializer( new CollisionRadiusInit( 2 ) );
      
      var smoke:InitializerGroup = new InitializerGroup();
      smoke.addInitializer( new ImageClass( Dot, [10] ) );
      smoke.addInitializer( new ColorInit( 0xFFFFFFFF, 0xFFFFFFFF ) );
      smoke.addInitializer( new MassInit( 5 ) );
      smoke.addInitializer( new CollisionRadiusInit( 10 ) );
      
      addInitializer( new Position( new BoxZone( 280, 280, 280, new Vector3D( 0, 0, 0 ), new Vector3D( 0, 1, 0 ), new Vector3D( 0, 0, 1 ) ) ) );
      addInitializer( new Velocity( new SphereZone( new Vector3D( 0, 0, 0 ), 150, 100 ) ) );
      
      addInitializer( new ChooseInitializer( [ air, smoke ], [ 30, 1 ] ) );
      
      addAction( new Move() );
      addAction( new Collide( 1 ) );
      addAction( new BoundingBox( -150, 150, -150, 150, -150, 150, 1 ) );
      addAction( new ShowAirAction( stage ) );
    }
  }
}
package
{
  import org.flintparticles.common.actions.ActionBase;
  import org.flintparticles.common.emitters.Emitter;
  import org.flintparticles.common.particles.Particle;

  import flash.display.DisplayObject;
  import flash.events.KeyboardEvent;
  import flash.ui.Keyboard;

  

  public class ShowAirAction extends ActionBase
  {
    private var _isDown:Boolean;
    
    
    public function ShowAirAction( stage:DisplayObject )
    {
      _isDown = false;
      stage.addEventListener( KeyboardEvent.KEY_DOWN, keyDownListener, false, 0, true );
      stage.addEventListener( KeyboardEvent.KEY_UP, keyUpListener, false, 0, true );
    }
    
    private function keyDownListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = true;
      }
    }
    private function keyUpListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = false;
      }
    }

    
    override public function update( emitter:Emitter, particle:Particle, time:Number ):void
    {
      if( particle.mass == 1 )
      {
        if( _isDown )
        {
          particle.color = 0;
        }
        else
        {
          particle.color = 0xFF666666;
        }
      }
    }
  }
}
import org.flintparticles.common.counters.*;
import org.flintparticles.common.displayObjects.Dot;
import org.flintparticles.common.initializers.*;
import org.flintparticles.threeD.actions.*;
import org.flintparticles.threeD.emitters.Emitter3D;
import org.flintparticles.threeD.initializers.*;
import org.flintparticles.threeD.renderers.*;
import org.flintparticles.threeD.renderers.controllers.OrbitCamera;
import org.flintparticles.threeD.zones.*;  

var emitter:Emitter3D = new Emitter3D();
emitter.counter = new Blast( 400 );

var air:InitializerGroup = new InitializerGroup();
air.addInitializer( new ImageClass( Dot, [2] ) );
air.addInitializer( new ColorInit( 0xFF666666, 0xFF666666 ) );
air.addInitializer( new MassInit( 1 ) );
air.addInitializer( new CollisionRadiusInit( 2 ) );

var smoke:InitializerGroup = new InitializerGroup();
smoke.addInitializer( new ImageClass( Dot, [10] ) );
smoke.addInitializer( new ColorInit( 0xFFFFFFFF, 0xFFFFFFFF ) );
smoke.addInitializer( new MassInit( 5 ) );
smoke.addInitializer( new CollisionRadiusInit( 10 ) );

emitter.addInitializer( new Position( new BoxZone( 280, 280, 280, new Vector3D( 0, 0, 0 ), new Vector3D( 0, 1, 0 ), new Vector3D( 0, 0, 1 ) ) ) );
emitter.addInitializer( new Velocity( new SphereZone( new Vector3D( 0, 0, 0 ), 150, 100 ) ) );
emitter.addInitializer( new ChooseInitializer( [ air, smoke ], [ 30, 1 ] ) );

emitter.addAction( new Move() );
emitter.addAction( new Collide( 1 ) );
emitter.addAction( new BoundingBox( -150, 150, -150, 150, -150, 150, 1 ) );
emitter.addAction( new ShowAirAction( stage ) );

var renderer:DisplayObjectRenderer = new DisplayObjectRenderer();
renderer.x = 200;
renderer.y = 200;
renderer.addEmitter( emitter );
addChild( renderer );

renderer.camera.position = new Vector3D( 0, 0, -400 );
renderer.camera.target = new Vector3D( 0, 0, 0 );
renderer.camera.projectionDistance = 400;
var orbitter:OrbitCamera = new OrbitCamera( stage, renderer.camera );
orbitter.start();

emitter.start();
package
{
  import org.flintparticles.common.actions.ActionBase;
  import org.flintparticles.common.emitters.Emitter;
  import org.flintparticles.common.particles.Particle;

  import flash.display.DisplayObject;
  import flash.events.KeyboardEvent;
  import flash.ui.Keyboard;

  

  public class ShowAirAction extends ActionBase
  {
    private var _isDown:Boolean;
    
    
    public function ShowAirAction( stage:DisplayObject )
    {
      _isDown = false;
      stage.addEventListener( KeyboardEvent.KEY_DOWN, keyDownListener, false, 0, true );
      stage.addEventListener( KeyboardEvent.KEY_UP, keyUpListener, false, 0, true );
    }
    
    private function keyDownListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = true;
      }
    }
    private function keyUpListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = false;
      }
    }

    
    override public function update( emitter:Emitter, particle:Particle, time:Number ):void
    {
      if( particle.mass == 1 )
      {
        if( _isDown )
        {
          particle.color = 0;
        }
        else
        {
          particle.color = 0xFF666666;
        }
      }
    }
  }
}
<?xml version="1.0" encoding="utf-8"?>
<s:Application
  xmlns:fx="http://ns.adobe.com/mxml/2009" 
  xmlns:s="library://ns.adobe.com/flex/spark"
  xmlns:f="http://flintparticles.org/2009/flint3d"
  xmlns:geom="flash.geom.*"
  xmlns:local="*"
  width="500" height="500"
  backgroundColor="#000000">

<fx:Script>
  <![CDATA[
    import org.flintparticles.common.displayObjects.Dot;
  ]]>
</fx:Script>

<f:DisplayObjectRenderer id="renderer" width="500" height="500">
  <f:camera>
    <f:Camera projectionDistance="400">
      <f:position>
        <geom:Vector3D x="0" y="0" z="-400"/>
      </f:position>
    </f:Camera>
  </f:camera>
  <f:emitters>
    <f:Emitter id="emitter" autoStart="true">
      <f:counter>
        <f:Blast startCount="400"/>
      </f:counter>
      <f:initializers>
        <f:Position>
          <f:BoxZone width="280" height="280" depth="280"/>
        </f:Position>
        <f:Velocity>
          <f:SphereZone innerRadius="100" outerRadius="150"/>
        </f:Velocity>
        <f:ChooseInitializer weights="1,30">
          <f:InitializerGroup>
            <f:ImageClass imageClass="{Dot}" parameters="10"/>
            <f:CollisionRadiusInit radius="10"/>
            <f:MassInit mass="5"/>
            <f:ColorInit minColor="0xFFFFFFFF" maxColor="0xFFFFFFFF"/>
          </f:InitializerGroup>
          <f:InitializerGroup>
            <f:ImageClass imageClass="{Dot}" parameters="2"/>
            <f:CollisionRadiusInit radius="2"/>
            <f:MassInit mass="1"/>
            <f:ColorInit minColor="0xFF666666" maxColor="0xFF666666"/>
          </f:InitializerGroup>            
        </f:ChooseInitializer>
      </f:initializers>
      <f:actions>
        <f:Move/>
        <f:Collide bounce="1"/>
        <f:BoundingBox minX="-150" maxX="150" minY="-150" maxY="150" minZ="-150" maxZ="150"/>
        <local:ShowAirAction/>
      </f:actions>
    </f:Emitter>
  </f:emitters>
</f:DisplayObjectRenderer>
</s:Application>
package
{
  import flash.display.DisplayObject;
  import flash.events.Event;
  import flash.events.KeyboardEvent;
  import flash.ui.Keyboard;
  
  import mx.core.IMXMLObject;
  
  import org.flintparticles.common.actions.ActionBase;
  import org.flintparticles.common.emitters.Emitter;
  import org.flintparticles.common.particles.Particle;  

  

  public class ShowAirAction extends ActionBase implements IMXMLObject
  {
    private var _isDown:Boolean;
    
    
    public function ShowAirAction()
    {
      _isDown = false;
    }
    
    public function initialized( document:Object, id:String ):void
    {
      if( document.stage )
      {
        setStage( document.stage );
      }
      else
      {
        DisplayObject( document ).addEventListener( Event.ADDED_TO_STAGE, addedToStage );
      }
    }
      
    private function addedToStage( ev:Event ):void
    {
      setStage( ev.target.stage );
    }  
    
    private function setStage( stage:DisplayObject ):void
    {
      stage.addEventListener( KeyboardEvent.KEY_DOWN, keyDownListener, false, 0, true );
      stage.addEventListener( KeyboardEvent.KEY_UP, keyUpListener, false, 0, true );
    }
    
    private function keyDownListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = true;
      }
    }
    private function keyUpListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = false;
      }
    }

    
    override public function update( emitter:Emitter, particle:Particle, time:Number ):void
    {
      if( particle.mass == 1 )
      {
        if( _isDown )
        {
          particle.color = 0;
        }
        else
        {
          particle.color = 0xFF666666;
        }
      }
    }
  }
}
package
{
  import away3d.containers.ObjectContainer3D;
  import away3d.containers.View3D;

  import org.flintparticles.integration.away3d.v4.A3D4Renderer;
  import org.flintparticles.threeD.emitters.Emitter3D;

  import flash.display.Sprite;
  import flash.events.Event;

  [SWF(width='400', height='400', frameRate='60', backgroundColor='#000000')]
  
  public class Main extends Sprite
  {
    private var emitter:Emitter3D;
    private var view:View3D;
    private var renderer:A3D4Renderer;
    
    public function Main()
    {
      emitter = new BrownianMotion( stage );

      view = new View3D();
      view.width = 400;
      view.height = 400;
      addChild( view );
      
      var particleContainer:ObjectContainer3D = new ObjectContainer3D();
      view.scene.addChild( particleContainer );
      particleContainer.z = -200;
      
      renderer = new A3D4Renderer( particleContainer );
      renderer.addEmitter( emitter );

      emitter.start();
      
      addEventListener( Event.ENTER_FRAME, render, false, 0, true );
    }
    
    private function render( ev:Event ):void
    {
      // render the view
      view.render();
    }
  }
}
package
{
  import away3d.materials.ColorMaterial;
  import away3d.primitives.Sphere;

  import org.flintparticles.common.counters.Blast;
  import org.flintparticles.common.initializers.ChooseInitializer;
  import org.flintparticles.common.initializers.CollisionRadiusInit;
  import org.flintparticles.common.initializers.InitializerGroup;
  import org.flintparticles.common.initializers.MassInit;
  import org.flintparticles.integration.away3d.v4.initializers.A3D4CloneObject;
  import org.flintparticles.threeD.actions.BoundingBox;
  import org.flintparticles.threeD.actions.Collide;
  import org.flintparticles.threeD.actions.Move;
  import org.flintparticles.threeD.emitters.Emitter3D;
  import org.flintparticles.threeD.initializers.Position;
  import org.flintparticles.threeD.initializers.Velocity;
  import org.flintparticles.threeD.zones.BoxZone;
  import org.flintparticles.threeD.zones.SphereZone;

  import flash.display.DisplayObject;
  import flash.geom.Vector3D;

  public class BrownianMotion extends Emitter3D
  {
    public function BrownianMotion( stage:DisplayObject )
    {
      counter = new Blast( 400 );
      
      var air:InitializerGroup = new InitializerGroup();
      var airImage:Sphere = new Sphere( new ColorMaterial( 0x666666, 1 ), 2, 6, 6 );
      air.addInitializer( new A3D4CloneObject( airImage ) );
      air.addInitializer( new MassInit( 1 ) );
      air.addInitializer( new CollisionRadiusInit( 2 ) );
      
      var smoke:InitializerGroup = new InitializerGroup();
      var smokeImage:Sphere = new Sphere( new ColorMaterial( 0xFFFFFF, 1 ), 10, 10, 10 );
      smoke.addInitializer( new A3D4CloneObject( smokeImage ) );
      smoke.addInitializer( new MassInit( 5 ) );
      smoke.addInitializer( new CollisionRadiusInit( 10 ) );
      
      addInitializer( new Position( new BoxZone( 280, 280, 280, new Vector3D( 0, 0, 0 ), new Vector3D( 0, 1, 0 ), new Vector3D( 0, 0, 1 ) ) ) );
      addInitializer( new Velocity( new SphereZone( new Vector3D( 0, 0, 0 ), 150, 100 ) ) );
      
      addInitializer( new ChooseInitializer( [ air, smoke ], [ 30, 1 ] ) );
      
      addAction( new Move() );
      addAction( new Collide( 1 ) );
      addAction( new BoundingBox( -150, 150, -150, 150, -150, 150, 1 ) );
      addAction( new ShowAirAction( stage ) );
    }
  }
}
package
{
  import org.flintparticles.common.actions.ActionBase;
  import org.flintparticles.common.emitters.Emitter;
  import org.flintparticles.common.particles.Particle;

  import flash.display.DisplayObject;
  import flash.events.KeyboardEvent;
  import flash.ui.Keyboard;

  

  public class ShowAirAction extends ActionBase
  {
    private var _isDown:Boolean;
    
    
    public function ShowAirAction( stage:DisplayObject )
    {
      _isDown = false;
      stage.addEventListener( KeyboardEvent.KEY_DOWN, keyDownListener, false, 0, true );
      stage.addEventListener( KeyboardEvent.KEY_UP, keyUpListener, false, 0, true );
    }
    
    private function keyDownListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = true;
      }
    }
    private function keyUpListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = false;
      }
    }

    
    override public function update( emitter:Emitter, particle:Particle, time:Number ):void
    {
      if( particle.mass == 1 )
      {
        if( _isDown )
        {
          particle.color = 0;
        }
        else
        {
          particle.color = 0xFF666666;
        }
      }
    }
  }
}
package
{
  import flare.basic.Scene3D;
  import flare.basic.Viewer3D;
  import flare.core.Pivot3D;

  import org.flintparticles.integration.flare3d.F3DRenderer;
  import org.flintparticles.threeD.emitters.Emitter3D;

  import flash.display.Sprite;
  import flash.geom.Vector3D;

  [SWF(width='400', height='400', frameRate='60', backgroundColor='#000000')]
  
  public class Main extends Sprite
  {
    private var emitter:Emitter3D;
    private var scene:Scene3D;
    private var renderer:F3DRenderer;
    
    public function Main()
    {
      scene = new Viewer3D( this );
      scene.clearColor = new Vector3D( 0, 0, 0 );
      scene.camera.fieldOfView = 40;
      
      var particleContainer:Pivot3D = new Pivot3D();
      scene.addChild( particleContainer );
      particleContainer.z = 500;
      
      emitter = new BrownianMotion( stage );
      renderer = new F3DRenderer( particleContainer );
      renderer.addEmitter( emitter );

      emitter.start();
    }
  }
}
package
{
  import flare.materials.Shader3D;
  import flare.materials.filters.ColorFilter;
  import flare.primitives.Sphere;

  import org.flintparticles.common.counters.Blast;
  import org.flintparticles.common.initializers.ChooseInitializer;
  import org.flintparticles.common.initializers.CollisionRadiusInit;
  import org.flintparticles.common.initializers.ColorInit;
  import org.flintparticles.common.initializers.InitializerGroup;
  import org.flintparticles.common.initializers.MassInit;
  import org.flintparticles.integration.flare3d.initializers.F3DCloneObject;
  import org.flintparticles.threeD.actions.BoundingBox;
  import org.flintparticles.threeD.actions.Collide;
  import org.flintparticles.threeD.actions.Move;
  import org.flintparticles.threeD.emitters.Emitter3D;
  import org.flintparticles.threeD.initializers.Position;
  import org.flintparticles.threeD.initializers.Velocity;
  import org.flintparticles.threeD.zones.BoxZone;
  import org.flintparticles.threeD.zones.SphereZone;

  import flash.display.DisplayObject;
  import flash.geom.Vector3D;

  public class BrownianMotion extends Emitter3D
  {
    public function BrownianMotion( stage:DisplayObject )
    {
      counter = new Blast( 400 );

      var air:InitializerGroup = new InitializerGroup();
      var airMaterial:Shader3D = new Shader3D( 'airShader', [new ColorFilter( 0x666666 )], false );
      airMaterial.build();
      var airImage:Sphere = new Sphere( 'sphere', 2, 12, airMaterial );
      air.addInitializer( new F3DCloneObject( airImage ) );
      air.addInitializer( new MassInit( 1 ) );
      air.addInitializer( new CollisionRadiusInit( 2 ) );
      air.addInitializer( new ColorInit( 0xFF666666, 0xFF666666 ) );
      
      var smoke:InitializerGroup = new InitializerGroup();
      var smokeMaterial:Shader3D = new Shader3D( 'smokeShader', [new ColorFilter( 0xFFFFFF )], false );
      smokeMaterial.build();
      var smokeImage:Sphere = new Sphere( 'sphere', 10, 20, smokeMaterial );
      smoke.addInitializer( new F3DCloneObject( smokeImage ) );
      smoke.addInitializer( new MassInit( 5 ) );
      smoke.addInitializer( new CollisionRadiusInit( 10 ) );
      
      addInitializer( new Position( new BoxZone( 280, 280, 280, new Vector3D( 0, 0, 0 ), new Vector3D( 0, 1, 0 ), new Vector3D( 0, 0, 1 ) ) ) );
      addInitializer( new Velocity( new SphereZone( new Vector3D( 0, 0, 0 ), 150, 100 ) ) );
      
      addInitializer( new ChooseInitializer( [ air, smoke ], [ 30, 1 ] ) );

      addAction( new Move() );
      addAction( new Collide( 1 ) );
      addAction( new BoundingBox( -150, 150, -150, 150, -150, 150, 1 ) );
      addAction( new ShowAirAction( stage ) );
    }
  }
}
package
{
  import flare.core.Pivot3D;

  import org.flintparticles.common.actions.ActionBase;
  import org.flintparticles.common.emitters.Emitter;
  import org.flintparticles.common.particles.Particle;

  import flash.display.DisplayObject;
  import flash.events.KeyboardEvent;
  import flash.ui.Keyboard;

  

  public class ShowAirAction extends ActionBase
  {
    private var _isDown:Boolean;
    
    
    public function ShowAirAction( stage:DisplayObject )
    {
      _isDown = false;
      stage.addEventListener( KeyboardEvent.KEY_DOWN, keyDownListener, false, 0, true );
      stage.addEventListener( KeyboardEvent.KEY_UP, keyUpListener, false, 0, true );
    }
    
    private function keyDownListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = true;
      }
    }
    private function keyUpListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = false;
      }
    }

    
    override public function update( emitter:Emitter, particle:Particle, time:Number ):void
    {
      if( particle.mass == 1 )
      {
        if( _isDown )
        {
          //particle.color = 0;
          Pivot3D( particle.image ).hide();
        }
        else
        {
          //particle.color = 0xFF666666;
          Pivot3D( particle.image ).show();
        }
      }
    }
  }
}
package
{
  import alternativa.engine3d.core.Camera3D;
  import alternativa.engine3d.core.Object3D;
  import alternativa.engine3d.core.Resource;
  import alternativa.engine3d.core.View;

  import org.flintparticles.integration.alternativa3d.Alt3DRenderer;
  import org.flintparticles.threeD.emitters.Emitter3D;

  import flash.display.Sprite;
  import flash.display.Stage3D;
  import flash.events.Event;

  [SWF(width='400', height='400', frameRate='60', backgroundColor='#000000')]
  
  public class Main extends Sprite
  {
    private var emitter : Emitter3D;
    private var particleContainer : Object3D;
    private var camera : Camera3D;
    private var stage3D : Stage3D;
    private var renderer : Alt3DRenderer;

    public function Main()
    {
      camera = new Camera3D( 0.1, 10000 );
      camera.view = new View( stage.stageWidth, stage.stageHeight );
      camera.view.backgroundColor = 0x000000;
      camera.view.hideLogo();
      addChild( camera.view );
      addChild( camera.diagram );
      
      camera.rotationX = 0;
      camera.y = 0;
      camera.z = -360;

      stage3D = stage.stage3Ds[0];
      stage3D.addEventListener( Event.CONTEXT3D_CREATE, onContextCreate );
      stage3D.requestContext3D();
    }

    private function onContextCreate( event : Event ) : void
    {
      particleContainer = new Object3D();
      particleContainer.addChild( camera );
      renderer = new Alt3DRenderer( particleContainer );
      
      emitter = new BrownianMotion( stage );
      renderer.addEmitter( emitter );

      emitter.start();

      addEventListener( Event.ENTER_FRAME, render, false, 0, true );
    }

    private function render( ev : Event ) : void
    {
      // render the view
      camera.view.width = stage.stageWidth;
      camera.view.height = stage.stageHeight;
      camera.render( stage3D );
      for each ( var resource:Resource in particleContainer.getResources( true ) )
      {
        resource.upload( stage3D.context3D );
      }
    }
  }
}
package
{
  import alternativa.engine3d.materials.FillMaterial;
  import alternativa.engine3d.primitives.GeoSphere;

  import org.flintparticles.common.counters.Blast;
  import org.flintparticles.common.initializers.ChooseInitializer;
  import org.flintparticles.common.initializers.CollisionRadiusInit;
  import org.flintparticles.common.initializers.InitializerGroup;
  import org.flintparticles.common.initializers.MassInit;
  import org.flintparticles.integration.alternativa3d.initializers.Alt3DCloneObject;
  import org.flintparticles.threeD.actions.BoundingBox;
  import org.flintparticles.threeD.actions.Collide;
  import org.flintparticles.threeD.actions.Move;
  import org.flintparticles.threeD.emitters.Emitter3D;
  import org.flintparticles.threeD.initializers.Position;
  import org.flintparticles.threeD.initializers.Velocity;
  import org.flintparticles.threeD.zones.BoxZone;
  import org.flintparticles.threeD.zones.SphereZone;

  import flash.display.DisplayObject;
  import flash.geom.Vector3D;

  public class BrownianMotion extends Emitter3D
  {
    public function BrownianMotion( stage:DisplayObject )
    {
      counter = new Blast( 400 );
      
      var air:InitializerGroup = new InitializerGroup();
      var airImage:GeoSphere = new GeoSphere( 2, 6, false, new FillMaterial( 0x666666, 1 ) );
      air.addInitializer( new Alt3DCloneObject( airImage ) );
      air.addInitializer( new MassInit( 1 ) );
      air.addInitializer( new CollisionRadiusInit( 2 ) );
      
      var smoke:InitializerGroup = new InitializerGroup();
      var smokeImage:GeoSphere = new GeoSphere( 10, 10, false, new FillMaterial( 0xFFFFFF, 1 ) );
      smoke.addInitializer( new Alt3DCloneObject( smokeImage ) );
      smoke.addInitializer( new MassInit( 5 ) );
      smoke.addInitializer( new CollisionRadiusInit( 10 ) );
      
      addInitializer( new Position( new BoxZone( 280, 280, 280, new Vector3D( 0, 0, 0 ), new Vector3D( 0, 1, 0 ), new Vector3D( 0, 0, 1 ) ) ) );
      addInitializer( new Velocity( new SphereZone( new Vector3D( 0, 0, 0 ), 150, 100 ) ) );
      
      addInitializer( new ChooseInitializer( [ air, smoke ], [ 30, 1 ] ) );
      
      addAction( new Move() );
      addAction( new Collide( 1 ) );
      addAction( new BoundingBox( -150, 150, -150, 150, -150, 150, 1 ) );
      addAction( new ShowAirAction( stage ) );
    }
  }
}
package
{
  import org.flintparticles.common.actions.ActionBase;
  import org.flintparticles.common.emitters.Emitter;
  import org.flintparticles.common.particles.Particle;

  import flash.display.DisplayObject;
  import flash.events.KeyboardEvent;
  import flash.ui.Keyboard;

  

  public class ShowAirAction extends ActionBase
  {
    private var _isDown:Boolean;
    
    
    public function ShowAirAction( stage:DisplayObject )
    {
      _isDown = false;
      stage.addEventListener( KeyboardEvent.KEY_DOWN, keyDownListener, false, 0, true );
      stage.addEventListener( KeyboardEvent.KEY_UP, keyUpListener, false, 0, true );
    }
    
    private function keyDownListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = true;
      }
    }
    private function keyUpListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = false;
      }
    }

    
    override public function update( emitter:Emitter, particle:Particle, time:Number ):void
    {
      if( particle.mass == 1 )
      {
        if( _isDown )
        {
          particle.color = 0;
        }
        else
        {
          particle.color = 0xFF666666;
        }
      }
    }
  }
}
package
{
  import away3d.containers.View3D;

  import org.flintparticles.integration.away3d.v3.A3D3Renderer;
  import org.flintparticles.threeD.emitters.Emitter3D;

  import flash.display.Sprite;
  import flash.events.Event;

  [SWF(width='400', height='400', frameRate='60', backgroundColor='#000000')]
  
  public class Main extends Sprite
  {
    private var emitter:Emitter3D;
    private var view:View3D;
    private var renderer:A3D3Renderer;
    
    public function Main()
    {
      emitter = new BrownianMotion( stage );

      view = new View3D({x:200,y:200});
      addChild(view);
      renderer = new A3D3Renderer( view.scene );
      renderer.addEmitter( emitter );

      emitter.start();
      
      addEventListener( Event.ENTER_FRAME, render, false, 0, true );
    }
    
    private function render( ev:Event ):void
    {
      // render the view
      view.render();
    }
  }
}
package
{
  import away3d.materials.ColorMaterial;
  import away3d.primitives.Sphere;

  import org.flintparticles.common.counters.Blast;
  import org.flintparticles.common.initializers.ChooseInitializer;
  import org.flintparticles.common.initializers.CollisionRadiusInit;
  import org.flintparticles.common.initializers.InitializerGroup;
  import org.flintparticles.common.initializers.MassInit;
  import org.flintparticles.integration.away3d.v3.initializers.A3D3ApplyMaterial;
  import org.flintparticles.integration.away3d.v3.initializers.A3D3ObjectClass;
  import org.flintparticles.threeD.actions.BoundingBox;
  import org.flintparticles.threeD.actions.Collide;
  import org.flintparticles.threeD.actions.Move;
  import org.flintparticles.threeD.emitters.Emitter3D;
  import org.flintparticles.threeD.initializers.Position;
  import org.flintparticles.threeD.initializers.Velocity;
  import org.flintparticles.threeD.zones.BoxZone;
  import org.flintparticles.threeD.zones.SphereZone;

  import flash.display.DisplayObject;
  import flash.geom.Vector3D;

  public class BrownianMotion extends Emitter3D
  {
    public function BrownianMotion( stage:DisplayObject )
    {
      counter = new Blast( 400 );
      
      var air:InitializerGroup = new InitializerGroup();
      air.addInitializer( new A3D3ObjectClass( Sphere, [ { radius:2, segmentsW:4, segmentsH:4 } ] ) );
      air.addInitializer( new A3D3ApplyMaterial( ColorMaterial, 0x666666, 1 ) );
      air.addInitializer( new MassInit( 1 ) );
      air.addInitializer( new CollisionRadiusInit( 2 ) );
      
      var smoke:InitializerGroup = new InitializerGroup();
      smoke.addInitializer( new A3D3ObjectClass( Sphere, [ { radius:10, segmentsW:6, segmentsH:6 } ] ) );
      smoke.addInitializer( new A3D3ApplyMaterial( ColorMaterial, 0xFFFFFF, 1 ) );
      smoke.addInitializer( new MassInit( 5 ) );
      smoke.addInitializer( new CollisionRadiusInit( 10 ) );
      
      addInitializer( new Position( new BoxZone( 280, 280, 280, new Vector3D( 0, 0, 0 ), new Vector3D( 0, 1, 0 ), new Vector3D( 0, 0, 1 ) ) ) );
      addInitializer( new Velocity( new SphereZone( new Vector3D( 0, 0, 0 ), 150, 100 ) ) );
      
      addInitializer( new ChooseInitializer( [ air, smoke ], [ 30, 1 ] ) );
      
      addAction( new Move() );
      addAction( new Collide( 1 ) );
      addAction( new BoundingBox( -150, 150, -150, 150, -150, 150, 1 ) );
      addAction( new ShowAirAction( stage ) );
    }
  }
}
package
{
  import org.flintparticles.common.actions.ActionBase;
  import org.flintparticles.common.emitters.Emitter;
  import org.flintparticles.common.particles.Particle;

  import flash.display.DisplayObject;
  import flash.events.KeyboardEvent;
  import flash.ui.Keyboard;

  

  public class ShowAirAction extends ActionBase
  {
    private var _isDown:Boolean;
    
    
    public function ShowAirAction( stage:DisplayObject )
    {
      _isDown = false;
      stage.addEventListener( KeyboardEvent.KEY_DOWN, keyDownListener, false, 0, true );
      stage.addEventListener( KeyboardEvent.KEY_UP, keyUpListener, false, 0, true );
    }
    
    private function keyDownListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = true;
      }
    }
    private function keyUpListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = false;
      }
    }

    
    override public function update( emitter:Emitter, particle:Particle, time:Number ):void
    {
      if( particle.mass == 1 )
      {
        if( _isDown )
        {
          particle.color = 0;
        }
        else
        {
          particle.color = 0xFF666666;
        }
      }
    }
  }
}
package
{
  import org.flintparticles.integration.papervision3d.PV3DParticleRenderer;
  import org.flintparticles.threeD.emitters.Emitter3D;
  import org.papervision3d.cameras.Camera3D;
  import org.papervision3d.core.geom.Particles;
  import org.papervision3d.render.BasicRenderEngine;
  import org.papervision3d.scenes.Scene3D;
  import org.papervision3d.view.Viewport3D;

  import flash.display.Sprite;
  import flash.events.Event;

  [SWF(width='400', height='400', frameRate='60', backgroundColor='#000000')]
  
  public class Main extends Sprite
  {
    private var viewport:Viewport3D;
    private var emitter:Emitter3D;
    private var pv3dRenderer:BasicRenderEngine;
    private var flintRenderer:PV3DParticleRenderer;
    private var scene:Scene3D;
    private var camera:Camera3D;

    public function Main()
    {
      viewport = new Viewport3D( 400, 400 );
      addChild( viewport );
      
      pv3dRenderer = new BasicRenderEngine();
      scene = new Scene3D();
      camera = new Camera3D();
      camera.z = -400;
      
      var particles:Particles = new Particles();
      scene.addChild( particles );
      
      emitter = new BrownianMotion( stage );

      flintRenderer = new PV3DParticleRenderer( particles );
      flintRenderer.addEmitter( emitter );
      emitter.start();
      
      addEventListener( Event.ENTER_FRAME, render );
    }
    
    private function render( ev:Event ):void
    {
      // render the view
      pv3dRenderer.renderScene( scene, camera, viewport);
    }
  }
}
package
{
  import org.flintparticles.common.counters.Blast;
  import org.flintparticles.common.initializers.ChooseInitializer;
  import org.flintparticles.common.initializers.CollisionRadiusInit;
  import org.flintparticles.common.initializers.ColorInit;
  import org.flintparticles.common.initializers.InitializerGroup;
  import org.flintparticles.common.initializers.MassInit;
  import org.flintparticles.integration.papervision3d.initializers.PV3DApplyMaterial;
  import org.flintparticles.integration.papervision3d.initializers.PV3DObjectClass;
  import org.flintparticles.threeD.actions.BoundingBox;
  import org.flintparticles.threeD.actions.Collide;
  import org.flintparticles.threeD.actions.Move;
  import org.flintparticles.threeD.emitters.Emitter3D;
  import org.flintparticles.threeD.initializers.Position;
  import org.flintparticles.threeD.initializers.Velocity;
  import org.flintparticles.threeD.zones.BoxZone;
  import org.flintparticles.threeD.zones.SphereZone;
  import org.papervision3d.core.geom.renderables.Particle;
  import org.papervision3d.materials.special.ParticleMaterial;

  import flash.display.DisplayObject;
  import flash.geom.Vector3D;

  public class BrownianMotion extends Emitter3D
  {
    public function BrownianMotion( stage:DisplayObject )
    {
      counter = new Blast( 400 );
      
      var air:InitializerGroup = new InitializerGroup();
      air.addInitializer( new PV3DObjectClass( Particle, null, 4 ) );
      air.addInitializer( new ColorInit( 0xFF666666, 0xFF666666 ) );
      air.addInitializer( new MassInit( 1 ) );
      air.addInitializer( new CollisionRadiusInit( 2 ) );
      air.addInitializer( new PV3DApplyMaterial( ParticleMaterial, 0x666666, 1, ParticleMaterial.SHAPE_CIRCLE ) );
      
      var smoke:InitializerGroup = new InitializerGroup();
      smoke.addInitializer( new PV3DObjectClass( Particle, null, 20 ) );
      smoke.addInitializer( new ColorInit( 0xFFFFFFFF, 0xFFFFFFFF ) );
      smoke.addInitializer( new MassInit( 5 ) );
      smoke.addInitializer( new CollisionRadiusInit( 10 ) );
      smoke.addInitializer( new PV3DApplyMaterial( ParticleMaterial, 0xFFFFFF, 1, ParticleMaterial.SHAPE_CIRCLE ) );
      
      addInitializer( new Position( new BoxZone( 280, 280, 280, new Vector3D( 0, 0, 0 ), new Vector3D( 0, 1, 0 ), new Vector3D( 0, 0, 1 ) ) ) );
      addInitializer( new Velocity( new SphereZone( new Vector3D( 0, 0, 0 ), 150, 100 ) ) );
      
      addInitializer( new ChooseInitializer( [ air, smoke ], [ 30, 1 ] ) );
      
      addAction( new Move() );
      addAction( new Collide( 1 ) );
      addAction( new BoundingBox( -150, 150, -150, 150, -150, 150, 1 ) );
      addAction( new ShowAirAction( stage ) );
    }
  }
}
package
{
  import org.flintparticles.common.actions.ActionBase;
  import org.flintparticles.common.emitters.Emitter;
  import org.flintparticles.common.particles.Particle;

  import flash.display.DisplayObject;
  import flash.events.KeyboardEvent;
  import flash.ui.Keyboard;

  

  public class ShowAirAction extends ActionBase
  {
    private var _isDown:Boolean;
    
    
    public function ShowAirAction( stage:DisplayObject )
    {
      _isDown = false;
      stage.addEventListener( KeyboardEvent.KEY_DOWN, keyDownListener, false, 0, true );
      stage.addEventListener( KeyboardEvent.KEY_UP, keyUpListener, false, 0, true );
    }
    
    private function keyDownListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = true;
      }
    }
    private function keyUpListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = false;
      }
    }

    
    override public function update( emitter:Emitter, particle:Particle, time:Number ):void
    {
      if( particle.mass == 1 )
      {
        if( _isDown )
        {
          particle.color = 0;
        }
        else
        {
          particle.color = 0xFF666666;
        }
      }
    }
  }
}