package { import away3d.animators.data.AnimationSequence; import away3d.cameras.Camera3D; import away3d.cameras.HoverCamera3D; import away3d.containers.Scene3D; import away3d.containers.View3D; import away3d.core.base.Billboard; import away3d.core.base.Face; import away3d.core.base.Mesh; import away3d.core.base.Segment; import away3d.core.base.Vertex; import away3d.core.math.Number3D; import away3d.events.CameraEvent; import away3d.loaders.utils.AnimationLibrary; import away3d.materials.ColorMaterial; import away3d.materials.WireColorMaterial; import away3d.materials.WireframeMaterial; import away3d.primitives.*; import away3d.primitives.data.PatchData; import flash.display.BlendMode; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.KeyboardEvent; import flash.events.MouseEvent; import flash.filters.GlowFilter; import flash.text.TextField; import flash.text.TextFormatAlign; import flash.utils.clearInterval; import flash.utils.setInterval; /* * @date 2009.02.28 * @author Raimundas Banevicius (Deril) [raima156@yahoo.com] */ [SWF(backgroundColor="0xFFFFFF", frameRate="25", quality="LOW", width="800", height="600")] public class A3dPrimitives extends Sprite { // ##### Constants // default screen dimensions private const DEFAULT_WIDTH : uint = 800; private const DEFAULT_HEIGHT : uint = 600; // mouso wheel zoom speed private const CAMERA_ZOOM_SPEED : Number = 0.3; // keyboard camera control steps private const CAMERA_MOVE_STEP : uint = 50; // LIMITS for MOUSE TURN.. (BIGER NUMBER - SLOWER MOVE) private const CAMERA_TURN_LIMIT : uint = 100; // 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; //test vars private var testVar : Number = 0; private var turtle:SeaTurtle; /** * constructor */ public function A3dPrimitives():void { // Don't scale //this.stage.scaleMode = StageScaleMode.NO_SCALE; //this.stage.align = StageAlign.TOP_LEFT; // create scene scene = new Scene3D(); camera = new Camera3D({zoom:10, focus:100}); camera.x = 1500; camera.y = 1500; camera.z = -1500; camera.lookAt(new Number3D()); // create a viewport view = new View3D({scene:scene, camera:camera, x:this.DEFAULT_WIDTH / 2, y:this.DEFAULT_HEIGHT / 2}); addChild(view); // ### debug primitives ### // trident primitive... var trident : Trident = new Trident(800, true); scene.addChild(trident); // gridPlane var gridPlane : GridPlane = new GridPlane(); gridPlane.width = 1000; gridPlane.height = 1000; gridPlane.segmentsH = 10; gridPlane.segmentsW = 10; scene.addChild(gridPlane); //## standart 3d primitives //* var sphere:Sphere = new Sphere(); scene.addChild(sphere); sphere.moveTo(-700, 0, 0); var wsphere:WireSphere = new WireSphere(); scene.addChild(wsphere); wsphere.moveTo(-950, 0, 0); var gsphere:GeodesicSphere = new GeodesicSphere(); scene.addChild(gsphere); gsphere.moveTo(-700, 0, 300); var torus:Torus = new Torus() scene.addChild(torus); torus.moveTo(-700, 0, -300); var wtorus:WireTorus = new WireTorus() scene.addChild(wtorus); wtorus.moveTo(-1000, 0, -300); //### var cube:Cube = new Cube(); scene.addChild(cube); cube.moveTo( 300, 0, -600); var wcube:WireCube = new WireCube(); scene.addChild(wcube); wcube.moveTo( 300, 0, -750); var roundCube:RoundedCube = new RoundedCube(); scene.addChild(roundCube); roundCube.moveTo( 100, 0, -600); var cone:Cone = new Cone(); scene.addChild(cone); cone.moveTo(-200, 0, -600); var wcone:WireCone = new WireCone(); scene.addChild(wcone); wcone.moveTo(-200, 0, -820); var cylinder:Cylinder = new Cylinder(); scene.addChild(cylinder); cylinder.moveTo(-400, 0, -600); var wcylinder:WireCylinder = new WireCylinder(); scene.addChild(wcylinder); wcylinder.moveTo( -400, 0, -820); //### var lineSegm:LineSegment = new LineSegment(); scene.addChild(lineSegm); lineSegm.moveTo(600, 0, -500); //var bPatch:BezierPatch = new BezierPatch(???) //scene.addChild(bPatch); //bPatch.moveTo(600, 0, -700); var triangl:Triangle = new Triangle() scene.addChild(triangl); triangl.bothsides = true; triangl.moveTo(600, 0, -400); var plane:Plane = new Plane(); scene.addChild(plane); plane.moveTo(600, 0, -200); var wplane:WirePlane = new WirePlane(); scene.addChild(wplane); wplane.moveTo(800, 0, -200); var regPoligon:RegularPolygon = new RegularPolygon(); scene.addChild(regPoligon); regPoligon.moveTo(650, 0, 200); var wcircle:WireCircle = new WireCircle(); scene.addChild(wcircle); wcircle.moveTo(900, 0, 200); //############ // experimental... //var reflPlane:ReflectivePlane = new ReflectivePlane(view); //scene.addChild(reflPlane); //reflPlane.width = 1000; //reflPlane.height = 1000; //reflPlane.rotationX = 90; //reflPlane.moveTo(0, -500, 0); //############ var skyBox:Skybox = new Skybox(new ColorMaterial(0xFFFFBF), new ColorMaterial(0xCCFFCC), new ColorMaterial(0xFFC1C1), new ColorMaterial(0xE1E1E1), new ColorMaterial(0xB9FFFF), new ColorMaterial(0xE6FFFF)); scene.addChild(skyBox); //var skyBox6:Skybox6 = new Skybox6(new ColorMaterial(0xE6FFFF)) //scene.addChild(skyBox6); //*/ // ### sea turte ### turtle = new SeaTurtle(); scene.addChild(turtle); turtle.rotationX = -90; turtle.rotationY = 90; // ######## Object3D params and methods ######## //* // ### movement ### // acording container cord. system //turtle.x = 100; //turtle.y = 200; //turtle.z = 300; //turtle.moveTo(200, -500, 0); // Returns the position of the 3d object, can also set it... //turtle.position = new Number3D(0, 0, 0); // move along local axis (can use negative number too..) // x //turtle.moveRight(500) //turtle.moveLeft(200) // y //turtle.moveUp(500) //turtle.moveDown(300) // z //turtle.moveForward(100) //turtle.moveBackward(500) // local positioning //turtle.applyPosition(100, -200, 0); //Moves the 3d object along a vector by a defined length, //vector is defined from obqect center to 'axis' point //turtle.translate(new Number3D(500, 500, 0), 500) // ### rotation ### // euler angle acording container cord. system //turtle.rotationX = 90; //turtle.rotationY = 90; //turtle.rotationZ = 90; // Rotates the 3d object directly to a euler angle //turtle.rotateTo(0, 0, 90); // rotate along local axis (can use negative directien.. ) // x //turtle.pitch(90); // y //turtle.yaw(90) // z //turtle.roll(90) // get eulers as Number3D //trace(turtle.eulers); // set local rotation point //turtle.pivotPoint = new Number3D(200, 0, 0); // ..or.. //turtle.movePivot(200, 0, 0) // check if pivot is on (0,0,0) //trace('pivotZero :'+turtle.pivotZero); // "Rotates the 3d object around an axis by a defined angle" //vector is defined from center to 'axis' point //turtle.rotate(new Number3D(0, 100, 100), 90) // ### scale ### //turtle.scaleX = 0.5; //turtle.scaleY = 3; //turtle.scaleZ = 5; // all at once.. //turtle.scale(3); // ### transform ### // 3d transform in Matrix3D //trace('transform :'+turtle.transform); //### visual ### //turtle.visible = false; // Alpha... ownCanvas must be set to true for this to work.. : turtle.ownCanvas = true; //turtle.alpha = 0.5; // filters... ownCanvas must be set to true for this to work.. : turtle.ownCanvas = true; //turtle.filters.push(new GlowFilter(0xFF0000, 1, 50, 50, 1)); // blend mode... ownCanvas must be set to true for this to work.. : turtle.ownCanvas = true; //turtle.blendMode = BlendMode.DARKEN; //### info gathering ### // bounding box cordinates. (in objects local axis system) //trace('maxX :'+turtle.maxX); //trace('minX :'+turtle.minX); // //trace('maxY :'+turtle.maxY); //trace('minY :'+turtle.minY); // //trace('maxZ :'+turtle.maxZ); //trace('minZ :'+turtle.minZ); // bounding box sizes //trace('objectDepth:'+turtle.objectWidth); //trace('objectDepth:'+turtle.objectHeight); //trace('objectDepth:'+turtle.objectDepth); //bounding sphere radius //trace('boundingRadius :'+turtle.boundingRadius); //### debug ### // show Bounding Box //turtle.debugbb = true; // get Bounding Box (debugbb must be true) //trace(turtle.debugBoundingBox); // show Bounding Sphere //turtle.debugbs = true; // get Bounding Sphere (debugbs must be true) //trace(turtle.debugBoundingSphere); //### Mist ### // "An optional untyped object that can contain used-defined properties" //turtle.extra = new Object(); //turtle.extra.turtleFact = 'Tertles can fart too!?'; // optional name turtle.name = 'TurboTurtle' // return parent ObjectContainer3D //trace('parent :'+turtle.parent); //trace('scene =?= parent :', turtle.scene == turtle.parent); // make a clone.. //var newTurtle : SeaTurtle = new SeaTurtle(); //turtle.clone(newTurtle); //scene.addChild(newTurtle); //newTurtle.z += 500; // looks at point.. //turtle.lookAt(camera.position) // distance To another object... //trace('distanceTo camera :'+turtle.distanceTo(camera)); //toString function.. (returns object name if set..) //trace('toString: '+turtle.toString()); //### Scene ### // return scene //trace('scene:'+turtle.scene); // scene params //trace('scenePivotPoint :'+turtle.scenePivotPoint); //trace('scenePosition :'+turtle.scenePosition); //trace('sceneTransform :'+turtle.sceneTransform); //### Render stuff ### //optional renderer //turtle.renderer // ... I have a gues that it means it is put to separate Sprite for visuol efects to work... // ... I wonder how it will affect Zsorting... //turtle.ownCanvas = true; // Lights // enables render using own lights //turtle.ownLights = true; // get array of lights //trace('lightarray:'+turtle.lightarray) // Defines a unique render //turtle.ownSession = ??; // get used render session //trace('session:' + turtle.session); //### sorting ### //"Elements use their furthest point from the camera when z-sorting" //turtle.pushback = true; //"Elements use their nearest point to the camera when z-sorting" //turtle.pushfront = true; // Defines an additional offset to the z-sorting algorithm used on mesh elements or objects with ownCanvas set to true //trace('screenZOffset :'+ turtle.screenZOffset); // ### Mouse ### //turtle.mouseEnabled = false; //turtle.useHandCursor = true // ### unknown ### // "Reference container for all animations used in the container." [AnimationLibrary] //trace('animationLibrary :'+this.turtle.animationLibrary); // "Reference container for all geometries used in the container." [GeometryLibrary] //trace('geometryLibrary :'+this.turtle.geometryLibrary); // "Reference container for all materials used in the container." [MaterialLibrary] //trace('materialLibrary :'+this.turtle.materialLibrary); // center Vertex ... what for? For debuging? I have failed to get something not (0,0,0) // ... even after moving object in various ways... //trace('center:'+turtle.center) // "Apply the local rotations to the object without altering the apperance of child objects" // What for.. how to use.. //turtle.applyRotations(); // "Returns the inverse of sceneTransform." [Matrix3D] //turtle.inverseSceneTransform // ?? what is projector... //trace('projectorType :'+turtle.projectorType); // ?? Called by the TickTraverser. //turtle.tick(time:int) //Used when traversing the scenegraph //turtle.traverse(traverser:Traverser):void //turtle.updateObject() //turtle.updateSession() // ### event listeners ### // # mouse... //Default method for adding a mouseDown3D event listener //turtle.addOnMouseDown(testHandler); //Default method for adding a mouseUp3D event listener //turtle.addOnMouseUp(testHandler); //Default method for adding a mouseMove3D event listener //turtle.addOnMouseMove(testHandler); //Default method for adding a mouseOut3D event listener //turtle.addOnMouseOut(testHandler); //Default method for adding a mouseOver3D event listener //turtle.addOnMouseOver(testHandler); //Default method for adding a rollOut3D event listener //turtle.addOnRollOut(testHandler); //Default method for adding a rollOver3D event listener //turtle.addOnRollOver(testHandler); // # other... //Default method for adding a parentupdated event listener //turtle.addOnParentUpdate(testHandler); //Default method for adding a dimensionschanged event listener //turtle.addOnDimensionsChange(testHandler); //Default method for adding a scenechanged event listener //turtle.addOnSceneChange(testHandler); //Default method for adding a scenetransformchanged event listener //turtle.addOnSceneTransformChange(testHandler); //Default method for adding a sessionchanged event listener //turtle.addOnSessionChange(testHandler); //Default method for adding a transformchanged event listener //turtle.addOnTransformChange(testHandler); //*/ // ######## Mesh params and methods ######## //* // info // Class tyle used for mesh generation //trace('type :'+this.turtle.type); // source of the mesh or package name; //trace('url :'+this.turtle.url); // anim info // preix of started animation //trace('activePrefix :'+this.turtle.activePrefix); // anim fps (write only... why?) //this.turtle.fps = 25; // will anim loop (write only... why?) //this.turtle.loop = true; // transitionValue ... ? (TypeError: Error #1009: Cannot access a property or method of a null object reference.) //trace('transitionValue :'+this.turtle.transitionValue); // will anim smooth in beatwean frames (write only... why?) {TypeError: Error #1009: Cannot access a property or method of a null object reference.} // this.turtle.smooth = true; // cerent anim frame ... TypeError: Error #1009: Cannot access a property or method of a null object reference. ??? //trace('frame :'+this.turtle.frame); // ??? TypeError: Error #1009: Cannot access a property or method of a null object reference. //trace('hasCycleEvent :'+this.turtle.hasCycleEvent); // indicates present of SequenceEvent //trace('hasSequenceEvent :'+this.turtle.hasSequenceEvent); // is anim runing... //trace('isRunning :'+this.turtle.isRunning); //Starts playing the animation at the specified frame. TypeError: Error #1009: Cannot access a property or method of a null object reference. ??? //this.turtle.gotoAndPlay(1); //Brings the animation to the specifed frame and stops it there. TypeError: Error #1009: Cannot access a property or method of a null object reference. ??? //this.turtle.gotoAndStop(1); //Plays a sequence of frames TypeError: Error #1009: Cannot access a property or method of a null object reference. ??? //this.turtle.play(); //Passes an array of animationsequence objects to be added to the animation. //setPlaySequences(); //Plays a sequence of frames. (framenames must be be already existing) TypeError: Error #1009: Cannot access a property or method of a null object reference. ??? //this.turtle.playFrames([3, 1, 2], 10, true, true); // md2 frame indexes //trace('indexes :'+this.turtle.indexes); // ??? //trace('geometry :'+this.turtle.geometry); // // visible beth side or not.. //this.turtle.bothsides = true; //material for backs in object //this.turtle.back = new ColorMaterial(0xFF0000); // materials // for faces, segments or billboards //trace('material :'+this.turtle.material); //updates all materials.. //this.turtle.updateMaterials(this.turtle,view); //trace('faceMaterial :'+this.turtle.faceMaterial); // material for ebject that allways face the camera //this.turtle.billboardMaterial = new ColorMaterial(0xFF0000); // segment material for outline //this.turtle.outline = new WireframeMaterial(0xFF0000,{width:5});; // adds a billboard.. //var tempBilboard : Billboard = new Billboard(new Vertex( -1000, -1000, 1000), new ColorMaterial(0xFFFF77), 1000, 1000) //this.turtle.addBillboard(tempBilboard); // and removes it.. //this.turtle.removeBillboard(tempBilboard); // array of bilboards //trace('billboards :'+this.turtle.billboards); // array of elements (faces and segments ) //trace('elements :' + this.turtle.elements); // adds a Face //var tempVertex : Vertex; //this.turtle.addFace(new Face(tempVertex = new Vertex(1000, -1000, 1000), new Vertex( -1000, 1000, 1000), new Vertex(1000, 1000, -1000))); //this.turtle.updateVertex(tempVertex , -100, -500, 500 , true); //this.turtle.removeFace(this.turtle.faces[292]);; //Inverts the geometry of all face objects. // have no afect an turtle ??? // this.turtle.invertFaces(); // faces.. //trace('faces :'+this.turtle.faces); // adds a Segment //var tempSegment : Segment = new Segment(new Vertex(0, 1000, 0), new Vertex(1000, 0, 0)) //this.turtle.addSegment(tempSegment); //this.turtle.removeSegment (tempSegment) // segments //trace('segments :'+this.turtle.segments); // vertices //trace('vertices :'+this.turtle.vertices); // everides Object3D funct.. //applyPosition(); //applyRotations(); // Returns a formatted string containing a self contained AS3 class definition that can be used to re-create the mesh. //trace(this.turtle.asAS3Class('MyTurtleClassName', 'myPackage')); // Returns an xml representation of the mesh //trace(this.turtle.asXML()); // clone object propierties. //trace((this.turtle.clone() as Mesh).asXML()); /// clone abject propierties with geomotry... //trace((this.turtle.cloneAll() as Mesh).asXML()); //trace((this.turtle.clone() as Mesh).asXML() == (this.turtle.cloneAll() as Mesh).asXML()); // how these differ : Goametry containis face and segment elements it seams clone() clones it too... //Divides a face object into 2 face objects. //this.turtle.splitFace(this.turtle.faces[292]); //Divides all faces object into 2 face objects. //this.turtle.splitFaces(); //Divides a face object into 4 equal sized face objects. //this.turtle.quarterFace(this.turtle.faces[292]); //Divides all faces object into 4 equal sized face objects. //this.turtle.quarterFaces(); //Divides a face object into 3 face objects. //this.turtle.triFace(this.turtle.faces[292]) //Divides all faces object into 3 face objects. //this.turtle.triFaces() //Default method for adding a cycle event listener // [TypeError: Error #1009: Cannot access a property or method of a null object reference.] //this.turtle.addOnCycle(testHandler); //Default method for adding a sequenceDone event listener //this.turtle.addOnSequenceDone(testHandler); //*/ // 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.selectable = false; info.autoSize = TextFormatAlign.LEFT; info.text = 'AWAY 3d primitives (v1.0) [2009]\n' + 'Deril [raima156@yahoo.com] \n'+ '\n'+ 'Arrows to fly, \n'+ 'PageDown/UP - fly Down/Up, \n'+ 'Press 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.pan((this.stage.mouseX - this.DEFAULT_WIDTH / 2) / this.CAMERA_TURN_LIMIT); this.camera.pitch((this.stage.mouseY - this.DEFAULT_HEIGHT / 2) / this.CAMERA_TURN_LIMIT); } // render the view this.view.render(); } /** * Stage press handler */ private function handleMouseDown(e:MouseEvent):void{ this.moveCam = true; } /** * Stage release handler */ private function handleMouseUp(e:MouseEvent):void { this.moveCam = false; } /** * 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; // O case 79: camera.y += move_strength; break; // Q case 81: camera.y -= move_strength; break; // ; case 186: camera.x -= move_strength; break; // j case 74: camera.x += move_strength; break; // E case 69: camera.z -= move_strength; break; // U case 85: camera.z += move_strength; break; // " case 222: break; // A case 65: break; // // < case 188: break; // > case 190: break; // > NUM 8 case 104: camera.pitch(-move_strength); break; // > NUM 2 case 98: camera.pitch(move_strength); break; // > NUM 4 case 100: camera.pan(-move_strength); break; // > NUM 6 case 102: camera.pan(move_strength); break; // > NUM 7 case 103: camera.roll(-move_strength); break; // > NUM 9 case 105: camera.roll(move_strength); break; // > NUM 3 case 99: break; // > NUM 5 case 101: camera.lookAt(new Number3D()); 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; } } } }