/* Depth of Field Demo */ package { import away3d.cameras.Camera3D; import away3d.containers.ObjectContainer3D; import away3d.containers.View3D; import away3d.debug.AwayStats; import away3d.entities.Sprite3D; import away3d.filters.BloomFilter3D; import away3d.filters.BlurFilter3D; import away3d.filters.DepthOfFieldFilter3D; import away3d.filters.MotionBlurFilter3D; import away3d.filters.RadialBlurFilter3D; import away3d.materials.BitmapMaterial; import com.bit101.components.ComboBox; import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.geom.Matrix; import flash.geom.Vector3D; [SWF(frameRate=60,width=720,height=480)] /** * Filter Demo * @author yasu */ public class Main extends Sprite { [Embed(source="assets/image.png")] private var ImageCls:Class; private static const MAX_NUM:int = 500; private static const CAMERA_RADIUS:Number = 2500; private var particles:Vector.; private var cameraYaw:Number = 0; private var view:View3D; public function Main():void { view = new View3D(); view.width = 720; view.height = 480; view.camera.lens.far = 10000; addChild(view); addChild(new AwayStats(view)); stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; var comboBox:ComboBox = new ComboBox(this, 13, 100, "Choose Filter", ["MotionBlurFilter3D", "BlurFilter3D", "RadialBlurFilter3D", "BloomFilter3D", "DepthOfFieldFilter3D"]); comboBox.addEventListener(Event.SELECT, comboBox_selectHandler); var i:int; // bmp var bmd:BitmapData = Bitmap(new ImageCls()).bitmapData; // create blur field material var mtx:Matrix = new Matrix(1, 0, 0, 1, (128 - bmd.width) / 2, (128 - bmd.height) / 2); // copy bitmapdata var bitmapData:BitmapData = new BitmapData(128, 128, true, 0x00000000); bitmapData.draw(bmd, mtx); // ボール var mt:BitmapMaterial = new BitmapMaterial(bitmapData); mt.bothSides = true; mt.alphaBlending = true; mt.updateTexture(); // init particle particles = new Vector.(MAX_NUM, true); for (i = 0; i < MAX_NUM; i++) { var ball:Sprite3D = new Sprite3D(mt, 300, 300); view.scene.addChild(ball); particles[i] = ball; ball.position = new Vector3D((Math.random() - 0.5) * 3000, (Math.random() - 0.5) * 3000, (Math.random() - 0.5) * 3000); } addEventListener(Event.ENTER_FRAME, enterFrameHandler); } private function comboBox_selectHandler(e:Event):void { switch (ComboBox(e.currentTarget).selectedItem) { case "MotionBlurFilter3D": view.filters3d = [new MotionBlurFilter3D()]; break; case "BlurFilter3D": view.filters3d = [new BlurFilter3D(16, 16)]; break; case "RadialBlurFilter3D": view.filters3d = [new RadialBlurFilter3D()]; break; case "BloomFilter3D": view.filters3d = [new BloomFilter3D()]; break; case "DepthOfFieldFilter3D": var dof:DepthOfFieldFilter3D = new DepthOfFieldFilter3D(16, 16); dof.focusDistance = Vector3D.distance(view.camera.position, new Vector3D()); view.filters3d = [dof]; break; default: view.filters3d = []; } } private function enterFrameHandler(e:Event):void { var camera:Camera3D = view.camera; // camera cameraYaw += (mouseX / stage.stageWidth - 0.5) * 10; camera.x = Math.sin(cameraYaw * Math.PI / 180) * CAMERA_RADIUS; camera.z = Math.cos(cameraYaw * Math.PI / 180) * CAMERA_RADIUS; camera.y += (CAMERA_RADIUS * (mouseY / stage.stageHeight - 0.5) - camera.y) * 0.1; camera.lookAt(new Vector3D()); view.render(); } } }