package { import away3d.cameras.Camera3D; import away3d.containers.*; import away3d.core.base.*; import away3d.core.light.DirectionalLight; import away3d.core.math.Number3D; import away3d.core.utils.*; import away3d.events.CameraEvent; import away3d.lights.*; import away3d.materials.*; import away3d.primitives.*; import flash.display.*; import flash.events.*; import flash.geom.ColorTransform; import flash.geom.Matrix; import flash.text.*; import flash.utils.*; /* * @date 2009.03.26 * @author Raimundas Banevicius (Deril) [raima156@yahoo.com] */ [SWF(backgroundColor="0xFFFFFF", frameRate="25", quality="LOW", width="800", height="600")] public class A3dMaterial extends Sprite { // ##### Constants // default screen dimensions private const DEFAULT_WIDTH : uint = 800; private const DEFAULT_HEIGHT : uint = 600; // mouse wheel zoom speed private const CAMERA_ZOOM_SPEED : Number = 0.3; // comera rotate strength private const CAMERA_MOVE_STEP : uint = 50; // 3d engine vars private var scene:Scene3D; private var camera:Camera3D; private var view:View3D; // render (on intervals) engine private var engine:uint; // cam move flag (for mouse) private var moveCam:Boolean = false; [Embed(source="assets/rainbow.gif")] public static var RainbowOceanJPG:Class; [Embed(source="assets/stones.jpg")] public static var WallMat:Class; [Embed(source = "assets/stones_n.jpg")] public static var WallNormMat:Class; [Embed(source="assets/shape_anim.swf", symbol="Ranim")] public static var RCaruselAnim:Class; [Embed(source = "assets/FullAnim.swf", symbol="FullAnim")] public static var FullAnim:Class; private var mouseXPos: uint; private var camrot : uint; /** * constructor */ public function A3dMaterial():void { // create scene scene = new Scene3D(); camera = new Camera3D({zoom:10, focus:100}); camera.x = 0; camera.y = 0; camera.z = 0; camera.lookAt(new Number3D(1000, 0, 0)); // create a viewport view = new View3D({scene:scene, camera:camera, x:this.DEFAULT_WIDTH / 2, y:this.DEFAULT_HEIGHT / 2}); addChild(view); var light : DirectionalLight3D = new DirectionalLight3D({color:0xFFFFFF, ambient:0.25, diffuse:0.75, specular:0.9}); light.x = -400; light.z = -400; light.y = -400; light.debug = true; scene.addChild( light ); var mat1 : WireframeMaterial = new WireframeMaterial(0xFF80C0, { //alpha:1, //width:1 } ); createObjWithMaterial(mat1, 3); var mat2 : ColorMaterial = new ColorMaterial(0xFF80C0, { //alpha:1 } ); createObjWithMaterial(mat2, 2); var mat3 : WireColorMaterial = new WireColorMaterial(0xFF80C0, { //alpha:1, //width:1, //wirealpha:1, //wirecolor:Math.floor((Math.random() * 0xFFFFFF)) } ); createObjWithMaterial(mat3, 1); var mat4 : ShadingColorMaterial = new ShadingColorMaterial(0xFF80C0, { //alpha : 1, //ambient : Math.floor((Math.random() * 0xFFFFFF)), //ambient_brightness : 1, //diffuse : Math.floor((Math.random() * 0xFFFFFF)), //diffuse_brightness : 1, //specular : Math.floor((Math.random() * 0xFFFFFF)), //specular_brightness : 1, //shininess : 20;' //cache : false } ); createObjWithMaterial(mat4, 0); var mat5 : PhongColorMaterial = new PhongColorMaterial (0xFF80C0, { //alpha :1, //blendMode : BlendMode.NORMAL, //shininess : 20, //specular : 0.7 } ); createObjWithMaterial(mat5, -1); var mat6 : BitmapMaterial = new BitmapMaterial(Cast.bitmap(RainbowOceanJPG), { //alpha : 1, //color : Math.floor((Math.random() * 0xFFFFFF)), //colorTransform : new ColorTransform(), //blendMode : BlendMode.NORMAL, //repeat : false, //smooth : false, //precision : 0, //debug : false, //showNormals : false }); createObjWithMaterial(mat6, -2); var mat7 : TransformBitmapMaterial = new TransformBitmapMaterial(Cast.bitmap(RainbowOceanJPG), { //alpha : 1, //color : Math.floor((Math.random() * 0xFFFFFF)), //colorTransform : new ColorTransform(), //blendMode : BlendMode.NORMAL, //repeat : false, //smooth : false, //precision : 0, //debug : false, //showNormals : false //transform : new Matrix(...), scaleX : 0.5,//1 scaleY : 1, offsetX : 500,//0 offsetY : 0, rotation : 45//0 //projectionVector : new Number3D(...), //throughProjection : true, //globalProjection : false } ); createObjWithMaterial(mat7, -3) var mat8 : WhiteShadingBitmapMaterial = new WhiteShadingBitmapMaterial(Cast.bitmap(RainbowOceanJPG), { smooth : false, repeat : false, shininess : 20 }); //mat8.ambient_brightness = 1; //mat8.diffuse_brightness = 1; //mat8.specular_brightness = 1; createObjWithMaterial(mat8, -4); var mat9 : PhongBitmapMaterial = new PhongBitmapMaterial(Cast.bitmap(RainbowOceanJPG), { //shininess : 20, //specular : 0.7, //blendMode : BlendMode.NORMAL, //alpha : 1, //color : 0xFFFFFF }); createObjWithMaterial(mat9, -5); var mat10 : BitmapMaskMaterial = new BitmapMaskMaterial(Cast.bitmap(RainbowOceanJPG), { //color : 0xFFFFFF, //alpha : 1, //smooth : false, //precision : 0, //offsetX : 0, //offsetY : 0, //repeat : false, //blendMode : BlendMode.NORMAL, //debug : false, //showNormals : false }); createObjWithMaterial(mat10, -6); var mat11 : BitmapFileMaterial = new BitmapFileMaterial('pics/Rainbow_on_crack.jpg', { //alpha : 1, //color : Math.floor((Math.random() * 0xFFFFFF)), //colorTransform : new ColorTransform(), //blendMode : BlendMode.NORMAL, //repeat : false, //smooth : false, //precision : 0, //debug : false, //showNormals : false //transform : new Matrix(...), //scaleX : 1, //scaleY : 1, //offsetX : 0, //offsetY : 0, //rotation : 0, //projectionVector : new Number3D(...), //throughProjection : true, //globalProjection : false }); createObjWithMaterial(mat11, -7); var mat12 : AnimatedBitmapMaterial = new AnimatedBitmapMaterial(new RCaruselAnim(), { //loop : true, //autoplay : true, //index : 1, //alpha : 1, //color : Math.floor((Math.random() * 0xFFFFFF)), //colorTransform : new ColorTransform(), //blendMode : BlendMode.NORMAL, //repeat : false, //smooth : false, //precision : 0, //debug : false, //showNormals : false //transform : new Matrix(...), //scaleX : 1, //scaleY : 1, //offsetX : 0, //offsetY : 0, //rotation : 0, //projectionVector : new Number3D(...), //throughProjection : true, //globalProjection : false }); createObjWithMaterial(mat12, -8); var mat13 : MovieMaterial = new MovieMaterial(new FullAnim(), { //transparent : true, //autoUpdate : true, //interactive : false, //lockW : <...movie.width...>, //lockH : <...movie.height...>, //alpha : 1, //color : Math.floor((Math.random() * 0xFFFFFF)), //colorTransform : new ColorTransform(), //blendMode : BlendMode.NORMAL, //repeat : false, //smooth : false, //precision : 0, //debug : false, //showNormals : false //transform : new Matrix(...), //scaleX : 1, //scaleY : 1, //offsetX : 0, //offsetY : 0, //rotation : 0, //projectionVector : new Number3D(...), //throughProjection : true, //globalProjection : false }); createObjWithMaterial(mat13, -9); var mat14 : PhongMovieMaterial = new PhongMovieMaterial(new FullAnim(), { //blendMode : BlendMode.NORMAL, //alpha : 1, //color : 0xFFFFFF, //shininess : 20, //specular : 0.7 }); createObjWithMaterial(mat14, -10); var mat15 : VideoMaterial = new VideoMaterial( { file:'pics/fire.f4v',//'', //rtmp:'', loop:true//false //transparent : true, //autoUpdate : true, //interactive : false, //lockW : <...movie.width...>, //lockH : <...movie.height...>, //alpha : 1, //color : Math.floor((Math.random() * 0xFFFFFF)), //colorTransform : new ColorTransform(), //blendMode : BlendMode.NORMAL, //repeat : false, //smooth : false, //precision : 0, //debug : false, //showNormals : false //transform : new Matrix(...), //scaleX : 1, //scaleY : 1, //offsetX : 0, //offsetY : 0, //rotation : 0, //projectionVector : new Number3D(...), //throughProjection : true, //globalProjection : false } ) createObjWithMaterial(mat15, -11); var mat16 : Dot3BitmapMaterial = new Dot3BitmapMaterial(Cast.bitmap(WallMat), Cast.bitmap(WallNormMat), { //alpha : 1, //color : 0xFFFFFF, //blendMode : BlendMode.NORMAL, shininess:50//20, //specular:0.5 }); createObjWithMaterial(mat16, -12); var mat17 : Dot3BitmapMaterialF10 = new Dot3BitmapMaterialF10( Cast.bitmap(WallMat), Cast.bitmap(WallNormMat), { //alpha : 1, //color : 0xFFFFFF, //blendMode : BlendMode.NORMAL, shininess:50//20, //specular:0.7 }); createObjWithMaterial(mat17, -13); var mat18 : Dot3MovieMaterial = new Dot3MovieMaterial( new FullAnim(), Cast.bitmap(WallNormMat), { //alpha : 1, //color : 0xFFFFFF, //blendMode : BlendMode.NORMAL, shininess:50//20, //specular:0.7 }) createObjWithMaterial(mat18, -14); // init engine, listeners if (this.engine) clearInterval(this.engine); this.engine = setInterval(handleTick, 40); this.stage.addEventListener(MouseEvent.MOUSE_DOWN, handleMouseDown); this.stage.addEventListener(MouseEvent.MOUSE_UP, handleMouseUp); this.stage.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyPress); this.stage.addEventListener(MouseEvent.MOUSE_WHEEL, handleMouseWheel); //put info+signature var info : TextField = new TextField(); info.y = 550; info.selectable = false; info.autoSize = TextFormatAlign.LEFT; info.text = 'AWAY 3d materials (v1.0) [2009]\n' + 'Deril [raima156@yahoo.com] \n'+ //'\n'+ //'Arrows to fly, \n'+ //'PageDown/UP - fly Down/Up, \n'+ 'Press and drag mouse to look. \n' //'NUM 5 - look at stage. \n' this.addChild(info); } /** * Test function for event handlers * @param e - any event */ private function testHandler(e:Event):void{ trace('testHandler:',e); } /** * Interval engine ticks */ private function handleTick() : void { //trace('handleTick'); // move camera on mouse press.. if (this.moveCam) { this.camera.rotationY = (this.camrot - (this.mouseX-this.mouseXPos)/10)+360 this.camera.rotationX = ( this.mouseY-this.stage.stageHeight/2)/50; } // render the view this.view.render(); } /** * Stage press handler */ private function handleMouseDown(e:MouseEvent):void{ this.moveCam = true; this.mouseXPos = this.mouseX; this.camrot = this.camera.rotationY; } /** * Stage release handler */ private function handleMouseUp(e:MouseEvent):void { this.moveCam = false; } public function createObjWithMaterial(mat : Object, rototeBy : int):void{ var group : ObjectContainer3D = new ObjectContainer3D(); var plane : Plane = new Plane(); group.addChild(plane); plane.bothsides = true; //plane.ownCanvas = true; //plane.x = -700; //plane.z = -400; plane.width = 500; plane.height = 500; plane.rotationZ = 90; plane.rotationY = 90; plane.x = 4000; //plane.rotation = 45*height; //plane.rotate(new Number3D(0, 100, 100), 30*height) //plane.movePivot(-1000*height, 0, 0); //plane.rotationX = 10*height; //plane.y = height * 800; plane.material = mat as IMaterial; var sphere : GeodesicSphere = new GeodesicSphere(); group.addChild(sphere); sphere.radius = 300; sphere.x = 4000; sphere.y = 600; //sphere.y = height * 800; var infoSprite : Sprite = new Sprite(); var infoTF : TextField = new TextField(); infoTF.scaleX = infoTF.scaleY = 4; infoTF.text = String(mat); infoTF.autoSize = TextFieldAutoSize.LEFT; infoTF.border = false; infoSprite.addChild(infoTF); var bilBoard : Billboard = new Billboard(new Vertex(0, 500, 0), new MovieMaterial(infoSprite,{lockW:800, lockH:100, interactive:false, smooth:true, precision:2}),1000,1000); //bilBoard.x = 2000; sphere.addBillboard(bilBoard); sphere.material = mat as IMaterial; var cube : Cube = new Cube(); group.addChild(cube); cube.width = 300; cube.height = 600; cube.depth = 400; cube.x = 4000; cube.y = -600; cube.rotationY = 45; //cube.y = height * 800; cube.material = mat as IMaterial; //group.scale(3); group.rotationY = 20 * rototeBy; this.scene.addChild(group); } /** * Key press handler (I use DVORAK keybeard layout.. so some keys can make no sence ) */ private function handleKeyPress(e:KeyboardEvent):void { // camera move sterght, it can be modified be shift,ctrl var move_strength : uint = this.CAMERA_MOVE_STEP; if (e.shiftKey) move_strength *= 10; if (e.ctrlKey) move_strength = 1; switch(e.keyCode) { // up //case 38: camera.moveForward(move_strength); break; // down //case 40: camera.moveBackward(move_strength); break; // left //case 37:camera.moveLeft(move_strength);break; // right //case 39: camera.moveRight(move_strength); break; // page up //case 33: camera.moveUp(move_strength); break; // page down //case 34: camera.moveDown(move_strength); break; // // disabled keys //case 16: //case 17: //break; default: trace("Key '" + String.fromCharCode(e.charCode) + "'", 'is not set', '[keyCode:' + e.keyCode + ']'); break; } } /** * Zoom handler */ private function handleMouseWheel(e:MouseEvent):void { e.delta if (e.delta>0) { camera.zoom += this.CAMERA_ZOOM_SPEED; } else { camera.zoom -= this.CAMERA_ZOOM_SPEED; } } } }