Just discovered Flint for generating particles. Flint contains an away3d 4 renderer, which means we can have stage 3d accelerated particles.
See the demo.
And here is the code for this demo. To get this working you will need the FLINT source, and the latest Away3D 4 (broomstick) source.
package
{
import away3d.cameras.Camera3D;
import away3d.containers.ObjectContainer3D;
import away3d.containers.Scene3D;
import away3d.containers.View3D;
import away3d.debug.AwayStats;
import away3d.lights.PointLight;
import away3d.materials.BitmapFileMaterial;
import away3d.materials.ColorMaterial;
import away3d.primitives.Cube;
import away3d.primitives.Plane;
import away3d.primitives.Sphere;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.geom.Vector3D;
import org.flintparticles.common.actions.Age;
import org.flintparticles.common.counters.Steady;
import org.flintparticles.common.displayObjects.RadialDot;
import org.flintparticles.common.initializers.ImageClass;
import org.flintparticles.common.initializers.Lifetime;
import org.flintparticles.common.initializers.ScaleImageInit;
import org.flintparticles.integration.away3d.v4.A3D4Renderer;
import org.flintparticles.integration.away3d.v4.initializers.A3D4CloneObject;
import org.flintparticles.threeD.actions.DeathZone;
import org.flintparticles.threeD.actions.Move;
import org.flintparticles.threeD.actions.RandomDrift;
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.LineZone;
import org.flintparticles.threeD.zones.PointZone;
[SWF(width="1280", height="720", frameRate="60", backgroundColor="0x000000")]
public class SnowStorm extends Sprite
{
//engine
private var view:View3D ;
private var scene:Scene3D;
private var camera:Camera3D;
// materials
private var groundMat:ColorMaterial;
private var wallMat:ColorMaterial;
//lights
private var mainLight:PointLight;
//objects
private var ground:Plane;
private var cube:Cube;
private var player:Cube;
//particles
private var partContainer:ObjectContainer3D;
private var emitter:Emitter3D;
private var renderer:A3D4Renderer;
private var zone:BoxZone;
private var position:Position;
private var zone2:PointZone;
private var velocity:Velocity;
private var move:Move;
private var boxZone:BoxZone;
private var deathZone:DeathZone;
private var scaleImage:ScaleImageInit;
// other
private var isMouseDown:Boolean;
public function SnowStorm()
{
initEngine();
initLights();
initMaterials();
initObjects();
initParticles();
initListeners();
}
private function initEngine():void{
scene = new Scene3D();
camera = new Camera3D();
view = new View3D();
view.antiAlias = 4;
view.camera = camera;
view.scene = scene;
view.backgroundColor = 0x000000;
this.addChild(view);
camera.z=-250;
camera.y=50;
addChild(new AwayStats(view));
}
private function initLights():void{
mainLight = new PointLight ();
mainLight.x = 1000;
mainLight.y = 5000;
mainLight.z = -2000;
scene.addChild(mainLight);
}
private function initMaterials():void{
groundMat = new ColorMaterial (0xffffff,1);
groundMat.lights = [mainLight];
wallMat = new ColorMaterial(0xff3300,1);
wallMat.lights = [mainLight];
}
private function initObjects():void{
ground = new Plane (groundMat,5000,5000,1,1);
ground.x=0;
ground.y=0;
ground.z=0;
scene.addChild(ground);
cube = new Cube (wallMat,100,100,100,1,1,1);
cube.x=0;
cube.y=50;
cube.z=0;
cube.rotationY=30;
scene.addChild(cube);
// the player mesh. This mesh is technically not required as it is not in view of the camera, and does nothing. It is included for future collision detection, but you can remove all refernence to player if you like.
player = new Cube (wallMat,50,50,50,1,1,1);
player.x = camera.x;
player.y = camera.y-25;
player.z = camera.z+250;
scene.addChild(player);
partContainer = new ObjectContainer3D();
partContainer.x=0;
partContainer.y=500;
partContainer.z=0;
scene.addChild(partContainer);
}
private function initParticles():void{
//create emitter
emitter = new Emitter3D();
//initialize particle count
emitter.counter = new Steady(100);
//particle material
var particleMaterial:ColorMaterial = new ColorMaterial( 0xffffff,1);
var sphere:Sphere = new Sphere( particleMaterial, 2, 6, 6 );
emitter.addInitializer( new A3D4CloneObject( sphere, true, 400 ) );
//emission zone
zone = new BoxZone(5000,50,5000,new Vector3D(0,0,0));
position = new Position(zone);
emitter.addInitializer(position);
//velocity zone
zone2 = new PointZone(new Vector3D(0,-50,0));
velocity = new Velocity(zone2);
emitter.addInitializer(velocity);
//particle life
emitter.addInitializer(new Lifetime(10)); // this is the abbreviated way of using the addInitializer method
// add actions
move = new Move();
emitter.addAction(move);
//this is the abbreviated way of using the addAction method
emitter.addAction(new Age());
emitter.addAction(new RandomDrift(50,50,50));
// specify renderer
renderer = new A3D4Renderer(partContainer);
renderer.addEmitter(emitter);
//start the emitter
emitter.start();
}
private function initListeners():void{
this.addEventListener(MouseEvent.MOUSE_DOWN,onMdown);
this.addEventListener(MouseEvent.MOUSE_UP,onMup);
this.addEventListener(Event.ENTER_FRAME, loop);
}
private function onMdown(e:MouseEvent):void{
isMouseDown = true;
}
private function onMup(e:MouseEvent):void{
isMouseDown = false;
}
private function loop (e:Event ):void{
mouseMove();
view.render();
}
private function mouseMove():void{
// Tilt the camera up/down based on mouse position.
camera.rotationX -= -( mouseY - ( stage.stageHeight*0.5 ) ) * 0.005;
// spin the camera around based on mouse position.
camera.rotationY += ( mouseX - stage.stageWidth*0.5 ) * 0.005;
player.rotationY = camera.rotationY;
// if the mouse is down then move forward.
if( isMouseDown ) {
var xComponent:Number = Math.sin( camera.rotationY * Math.PI / 180 ) * 10;
var zComponent:Number = Math.cos( camera.rotationY * Math.PI / 180 ) * 10;
camera.position = new Vector3D(
camera.x + xComponent, camera.y, camera.z + zComponent );
player.position = new Vector3D( camera.x + xComponent, camera.y-25, camera.z + zComponent )
}
}
}
}