Beautifl - Flash Gallery

Preview

[Stardust] Papervision3D Floor
cjcat2266 2010年1月4日 MIT License
?
Stardust Particle Engine  
  
Homepage  
	http://code.google.com/p/stardust-particle-engine/  
  
Documentation  
	http://stardust-particle-engine.googlecode.com/svn/trunk/docs/index.html  
  
PDF Manual  
	http://stardust-particle-engine.googlecode.com/svn/trunk/manual/Stardust%20Particle%20Engine%20Manual.pdf
      /**
 * Stardust Particle Engine
 * 
 * Homepage
 *     http://code.google.com/p/stardust-particle-engine/
 * 
 * Documentation
 *     http://stardust-particle-engine.googlecode.com/svn/trunk/docs/index.html
 * 
 * PDF Manual
 *     http://stardust-particle-engine.googlecode.com/svn/trunk/manual/Stardust%20Particle%20Engine%20Manual.pdf
 */

package {
    import com.bit101.components.PushButton;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import idv.cjcat.stardust.common.clocks.SteadyClock;
    import idv.cjcat.stardust.common.math.StardustMath;
    import idv.cjcat.stardust.threeD.papervision3d.renderers.PV3DDisplayObject3DRenderer;
    import org.papervision3d.cameras.Camera3D;
    import org.papervision3d.core.geom.Lines3D;
    import org.papervision3d.core.geom.renderables.Line3D;
    import org.papervision3d.core.geom.renderables.Vertex3D;
    import org.papervision3d.materials.special.LineMaterial;
    import org.papervision3d.objects.DisplayObject3D;
    import org.papervision3d.render.BasicRenderEngine;
    import org.papervision3d.scenes.Scene3D;
    import org.papervision3d.view.Viewport3D;
    
    [SWF(backgroundColor="#000000", frameRate=60)]
    
    public class Main extends Sprite {
        
        private var pv3dSuperContainer:DisplayObject3D;
        private var pv3dContainer:DisplayObject3D;
        private var pv3dCamera:Camera3D;
        private var pv3dScene:Scene3D;
        private var pv3dViewport:Viewport3D;
        private var pv3dRenderer:BasicRenderEngine;
        
        private var emitter:CubeEmitter;
        
        public function Main():void {
            //PV3D setup
            pv3dSuperContainer = new DisplayObject3D();
            pv3dContainer = new DisplayObject3D();
            pv3dCamera = new Camera3D();
            pv3dCamera.y = 280;
            pv3dScene = new Scene3D();
            pv3dSuperContainer.addChild(pv3dContainer);
            pv3dScene.addChild(pv3dSuperContainer);
            pv3dViewport = new Viewport3D(465, 465);
            addChild(pv3dViewport);
            pv3dRenderer = new BasicRenderEngine();
            
            buildFloor();
            
            //emitter & renderer
            emitter = new CubeEmitter(new SteadyClock(0.25));
            pv3dScene.addChild(emitter.light);
            var renderer:PV3DDisplayObject3DRenderer = new PV3DDisplayObject3DRenderer(pv3dContainer);
            renderer.addEmitter(emitter);
            
            //speed buttons
            var btn0:PushButton = new PushButton(this, 10, 10, "0X", changeSpeed);
            var btn1:PushButton = new PushButton(this, 10, 30, "0.25X", changeSpeed);
            var btn2:PushButton = new PushButton(this, 10, 50, "0.5X", changeSpeed);
            var btn3:PushButton = new PushButton(this, 10, 70, "1X", changeSpeed);
            var btn4:PushButton = new PushButton(this, 10, 90, "2X", changeSpeed);
            var btn5:PushButton = new PushButton(this, 10, 110, "4X", changeSpeed);
            
            addEventListener(Event.ENTER_FRAME, mainLoop);
            stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseRotate);
            mouseRotate();
        }
        
        private function mainLoop(e:Event):void {
            emitter.step();
            pv3dRenderer.renderScene(pv3dScene, pv3dCamera, pv3dViewport);
        }
        
        private function changeSpeed(e:Event):void {
            var btn:PushButton = e.target as PushButton;
            
            if (btn.label == "0X") {
                emitter.actions.active = false;
                emitter.active = false;
                return
            }
            
            emitter.actions.active = true;
            emitter.active = true;
            
            //somehow the "switch" statement causes compile-time error :(
            if (btn.label == "0.25X") emitter.stepTimeInterval = 0.25;
            else if (btn.label == "0.5X") emitter.stepTimeInterval = 0.5;
            else if (btn.label == "1X") emitter.stepTimeInterval = 1;
            else if (btn.label == "2X") emitter.stepTimeInterval = 2;
            else if (btn.label == "4X") emitter.stepTimeInterval = 4;
        }
        
        private function mouseRotate(e:Event = null):void {
            pv3dContainer.rotationY = 0.65 * (232.5 - mouseX);
            pv3dSuperContainer.rotationX = 0.5 * (100 - mouseY);
            pv3dSuperContainer.rotationX = StardustMath.clamp(pv3dSuperContainer.rotationX, -80, 0);
        }
        
        private function buildFloor():void {
            var lineMat:LineMaterial = new LineMaterial(0xA0A0A0, 1);
            var lines:Lines3D = new Lines3D();
            pv3dContainer.addChild(lines);
            lines.addLine(new Line3D(lines, lineMat, 1, new Vertex3D( -400, 0, 0), new Vertex3D( 400, 0, 0)));
            lines.addLine(new Line3D(lines, lineMat, 1, new Vertex3D( 0, 0, -400), new Vertex3D( 0, 0, 400)));
            lines.addLine(new Line3D(lines, lineMat, 1, new Vertex3D( -400, 0, -400), new Vertex3D( 400, 0, -400)));
            lines.addLine(new Line3D(lines, lineMat, 1, new Vertex3D( 400, 0, -400), new Vertex3D( 400, 0, 400)));
            lines.addLine(new Line3D(lines, lineMat, 1, new Vertex3D( 400, 0, 400), new Vertex3D( -400, 0, 400)));
            lines.addLine(new Line3D(lines, lineMat, 1, new Vertex3D( -400, 0, 400), new Vertex3D( -400, 0, -400)));
        }
    }
}

//------------------------------------------------------------------------------------------------

import flash.display.Shape;
import idv.cjcat.stardust.common.actions.Age;
import idv.cjcat.stardust.common.actions.CompositeAction;
import idv.cjcat.stardust.common.actions.DeathLife;
import idv.cjcat.stardust.common.actions.ScaleCurve;
import idv.cjcat.stardust.common.clocks.Clock;
import idv.cjcat.stardust.common.initializers.Life;
import idv.cjcat.stardust.common.math.UniformRandom;
import idv.cjcat.stardust.threeD.actions.Deflect3D;
import idv.cjcat.stardust.threeD.actions.Gravity3D;
import idv.cjcat.stardust.threeD.actions.Move3D;
import idv.cjcat.stardust.threeD.actions.Spin3D;
import idv.cjcat.stardust.threeD.deflectors.PlaneDeflector;
import idv.cjcat.stardust.threeD.emitters.Emitter3D;
import idv.cjcat.stardust.threeD.fields.UniformField3D;
import idv.cjcat.stardust.threeD.initializers.DisplayObjectClass3D;
import idv.cjcat.stardust.threeD.initializers.Omega3D;
import idv.cjcat.stardust.threeD.initializers.Position3D;
import idv.cjcat.stardust.threeD.initializers.Rotation3D;
import idv.cjcat.stardust.threeD.initializers.Velocity3D;
import idv.cjcat.stardust.threeD.zones.SinglePoint3D;
import idv.cjcat.stardust.threeD.zones.SphereCap;
import org.papervision3d.core.proto.LightObject3D;
import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.primitives.Cube;

//------------------------------------------------------------------------------------------------

//I have no idea why this line must be added in order to compile successfully on Wonderfl.
//Just ignore this class :p
class BugFixer extends Shape { public function BugFixer() { } }

//------------------------------------------------------------------------------------------------

class CubeEmitter extends Emitter3D {
    
    public var light:LightObject3D;
    public var actions:CompositeAction;
    
    public function CubeEmitter(clock:Clock) {
        super(clock);
        
        //light & material
        light = new LightObject3D();
        light.y = 600;
        light.z = -1000;
        var mat:FlatShadeMaterial = new FlatShadeMaterial(light, 0x508DC5, 0x224488);
        
        
        //initializers
        var doc3D:DisplayObjectClass3D = new DisplayObjectClass3D();
        doc3D.displayObjectClass = Cube;
        doc3D.constructorParams = [new MaterialsList( { all:mat } ), 40, 40, 40];
        
        var cap:SphereCap = new SphereCap(0, 0, 0, 25, 37.5, 15);
        cap.rotationX = 180;
        
        var rotationRand:UniformRandom = new UniformRandom(0, 180);
        var omegaRand:UniformRandom = new UniformRandom(0, 4);
        
        addInitializer(doc3D);
        addInitializer(new Life(new UniformRandom(200, 0)));
        addInitializer(new Position3D(new SinglePoint3D(0, 0, 0)));
        addInitializer(new Velocity3D(cap));
        addInitializer(new Rotation3D(rotationRand, rotationRand, rotationRand));
        addInitializer(new Omega3D(omegaRand, omegaRand, omegaRand));
        
        
        //actions
        var field:UniformField3D = new UniformField3D(0, -1, 0);
        var gravity:Gravity3D = new Gravity3D();
        gravity.addField(field);
        
        var deflect:Deflect3D = new Deflect3D();
        deflect.addDeflector(new PlaneDeflector(0, 0, 0, 0, 1, 0));
        
        actions = new CompositeAction();
        actions.addAction(gravity);
        actions.addAction(deflect);
        actions.addAction(new Age());
        actions.addAction(new DeathLife());
        actions.addAction(new Move3D());
        actions.addAction(new Spin3D());
        actions.addAction(new ScaleCurve(5, 20));
        
        addAction(actions);
    }
}