/* DisplayObject2D for Papervision3D 2.0 (August 2009) Sources: http://labs.blitzagency.com/?p=377 http://sleepydesign.com/labs/as3/PaperVision3D/GreatWhite/DisplayObject2D/src/DisplayObject2D.as Usage: parentLayer = new ViewportLayer(viewport, null); viewport.containerSprite.addLayer(parentLayer); var do2D:DisplayObject2D = new DisplayObject2D(circle as DisplayObject, parentLayer); Note: Make sure all other objects in the parent layer have own containers too @author blitzagency @author katopz@sleepydesign.com @author Volkside http://www.volkside.com/contact @licence MIT Licence http://www.opensource.org/licenses/mit-license.php */ package { import flash.display.*; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.core.render.data.RenderSessionData; import org.papervision3d.core.proto.CameraObject3D; import org.papervision3d.view.layer.ViewportLayer; public class DisplayObject2D extends DisplayObject3D { public var displayObject:DisplayObject; private var parentLayer:ViewportLayer; private var scaleFactor:Number; private var offsetX:Number; private var offsetY:Number; public function DisplayObject2D(displayObject:DisplayObject, parentLayer:ViewportLayer=null, scaleFactor:Number=0, name:String=null, offsetX:Number=0, offsetY:Number=0) { this.parentLayer = parentLayer; this.displayObject = displayObject; this.scaleFactor = scaleFactor; this.offsetX = offsetX; this.offsetY = offsetY; super(name, null); if (parentLayer) { // create container viewportlayer (essentially a sprite) this.useOwnContainer = true; parentLayer.getChildLayer(this, true); container.addChild(displayObject); } } // "destructor" public function dispose():void { if (parentLayer && container) { container.removeChild(displayObject); parentLayer.removeLayer(container); this.useOwnContainer = false; } // release references parentLayer = null; container = null; displayObject = null; } public override function project(parent:DisplayObject3D, renderSessionData:RenderSessionData ):Number { super.project(parent, renderSessionData); var camera:CameraObject3D = renderSessionData.camera as CameraObject3D; var focus:Number = camera.focus; var zoom:Number = camera.zoom; if(this.autoCalcScreenCoords == false) { // projects three dimensional location onto a two dimensional plane calculateScreenCoords(camera); } var s_z:Number = screen.z; var persp:Number = focus / (focus + s_z) * zoom; var scale:Number = persp / zoom * scaleFactor; if (container != null) { // position container sprite // 01/06/2009 offset now takes perspective into account container.x = screen.x + (offsetX * persp); container.y = screen.y + (offsetY * persp); // apply scale factor if enabled if (scaleFactor != 0) container.scaleX = container.scaleY = scale; container.visible = s_z >= 0; } screenZ = s_z; // tell renderer to include this layer in sorting (for correct z-order) var rc = new RenderDisplayObject2D(this); renderSessionData.renderer.addToRenderList(rc); return s_z; } } }