package { import away3d.containers.View3D; import away3d.controllers.HoverController; import away3d.debug.AwayStats; import away3d.entities.Mesh; import away3d.lights.PointLight; import away3d.materials.TextureMaterial; import away3d.materials.lightpickers.StaticLightPicker; import away3d.materials.methods.BasicDiffuseMethod; import away3d.materials.methods.BasicSpecularMethod; import away3d.materials.methods.FresnelSpecularMethod; import away3d.materials.methods.SubsurfaceScatteringDiffuseMethod; import away3d.primitives.SphereGeometry; import away3d.textures.BitmapTexture; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.MouseEvent; import flash.ui.Mouse; import flash.ui.MouseCursor; import flash.utils.getTimer; /** * @author Yasunobu Ikeda */ public class Main extends View3D { //---------------------------------------------------------- // // Constructor // //---------------------------------------------------------- public function Main() { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } //---------------------------------------------------------- // // Property // //---------------------------------------------------------- [Embed(source = "assets/bg.jpg")] private var Bg:Class; [Embed(source = "assets/moonmap4k.jpg")] private var Diffuse:Class; [Embed(source = "assets/moonbump4k.jpg")] private var Normal:Class; private var cameraController:HoverController; private var lastMouseX:Number; private var lastMouseY:Number; private var lastPanAngle:Number; private var lastTiltAngle:Number; private var light:PointLight; private var lightPicker:StaticLightPicker; private var meshEarth:Mesh; private var move:Boolean = false; //---------------------------------------------------------- // // Function // //---------------------------------------------------------- public function init(event:Event = null):void { stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; antiAlias = 8; background = new BitmapTexture(new Bg().bitmapData); addChild(new AwayStats(this)); // Init 3D initLights(); initModels(); cameraController = new HoverController(camera, null, 135, 5, 1100, -70, 70); // Init Listener addEventListener(Event.ENTER_FRAME, enterFrameHandler); stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); } private function initLights():void { light = new PointLight(); light.x = 15000; light.z = 15000; light.color = 0xFFFFFF; light.ambient = 0.9; lightPicker = new StaticLightPicker([light]); scene.addChild(light); } private function initModels():void { // setup custom bitmap material var materialEarth:TextureMaterial = new TextureMaterial(new BitmapTexture(new Diffuse().bitmapData)); materialEarth.normalMap = new BitmapTexture(new Normal().bitmapData); materialEarth.lightPicker = lightPicker; materialEarth.gloss = 20; materialEarth.specular = 1; materialEarth.ambientColor = 0x000000; materialEarth.ambient = 1; // create subscattering diffuse method var subsurfaceMethod:SubsurfaceScatteringDiffuseMethod = new SubsurfaceScatteringDiffuseMethod(); subsurfaceMethod.scatterColor = 0xFFFFFF; subsurfaceMethod.scattering = .15; subsurfaceMethod.translucency = 4; materialEarth.diffuseMethod = subsurfaceMethod; // create fresnel specular method materialEarth.specularMethod = new FresnelSpecularMethod(true); meshEarth = new Mesh(new SphereGeometry(500, 64, 48), materialEarth); meshEarth.rotationY = 0; scene.addChild(meshEarth); } private function mouseDownHandler(event:MouseEvent):void { lastPanAngle = cameraController.panAngle; lastTiltAngle = cameraController.tiltAngle; lastMouseX = stage.mouseX; lastMouseY = stage.mouseY; move = true; stage.addEventListener(Event.MOUSE_LEAVE, mouseUpHandler); stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); Mouse.cursor = MouseCursor.HAND; } private function mouseUpHandler(event:MouseEvent):void { move = false; stage.removeEventListener(Event.MOUSE_LEAVE, mouseUpHandler); stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); Mouse.cursor = MouseCursor.AUTO; } private function enterFrameHandler(event:Event):void { if (move) { cameraController.panAngle = 0.05 * (stage.mouseX - lastMouseX) + lastPanAngle; cameraController.tiltAngle = 0.05 * (stage.mouseY - lastMouseY) + lastTiltAngle; } meshEarth.rotationY -= 0.05; light.x = Math.sin(getTimer() / 10000) * 150000; light.y = 500; light.z = Math.cos(getTimer() / 10000) * 150000; render(); } } }