/** * * DisplayObject2D for Papervision3D 2.0a * * @author blitzagency * @modifier katopz@sleepydesign.com * */ package com.blitzagency.papervision3d { import org.papervision3d.core.*; import org.papervision3d.core.proto.*; import org.papervision3d.core.geom.*; import org.papervision3d.core.geom.renderables.*; import org.papervision3d.core.render.data.RenderSessionData; import org.papervision3d.objects.*; import flash.display.*; public class DisplayObject2D extends DisplayObject3D { private var className:String; private var vertex:Vertex3D; private var scaleFactor:Number; //private var container:Sprite; public var displayObject:DisplayObject; public var imageSequence:MovieClip; public function DisplayObject2D( displayObject:DisplayObject, scaleFactor:Number=1, name:String=null, initObject:Object=null){ this.displayObject = displayObject; this.className = className; this.scaleFactor = scaleFactor; vertex = new Vertex3D(0,0,0); super(name, null, initObject); } public override function project( parent :DisplayObject3D, renderSessionData:RenderSessionData ):Number { super.project(parent, renderSessionData); var camera:CameraObject3D = renderSessionData.camera as CameraObject3D; if (!container) { container = new Sprite(); renderSessionData.container.addChild(container); container.addChild(displayObject); } var m11 :Number = view.n11; var m12 :Number = view.n12; var m13 :Number = view.n13; var m21 :Number = view.n21; var m22 :Number = view.n22; var m23 :Number = view.n23; var m31 :Number = view.n31; var m32 :Number = view.n32; var m33 :Number = view.n33; var focus:Number = camera.focus; var zoom:Number = camera.zoom; var vx :Number = vertex.x; var vy :Number = vertex.y; var vz :Number = vertex.z; var s_x :Number = vx * m11 + vy * m12 + vz * m13 + view.n14; var s_y :Number = vx * m21 + vy * m22 + vz * m23 + view.n24; var s_z :Number = vx * m31 + vy * m32 + vz * m33 + view.n34; screenZ = s_z; var persp:Number = focus / (focus + s_z) * zoom; var scale:Number = persp / zoom * scaleFactor; var x:Number = s_x * persp; var y:Number = s_y * persp; var z:Number = s_z; var rotationX:Number = 0;//convertAngleTo360(camera.rotationX - this.rotationX); var rotationY:Number = 0;//convertAngleTo360(camera.rotationY - this.rotationY); var rotationZ:Number = 0;//convertAngleTo360(camera.rotationZ - this.rotationZ); projectDisplayObject({x:x,y:y,z:z,rotationX:rotationX,rotationY:rotationY,rotationZ:rotationZ,scale:scale}); return s_z; } protected function projectDisplayObject(object:Object):void { container.x = object.x; container.y = object.y; container.scaleX = container.scaleY = object.scale; container.visible = object.z >= 0; if(imageSequence){ var frame:Number = Math.round(object.rotationY*(imageSequence.totalFrames-1)/360); imageSequence.gotoAndStop(frame+1); } } private function convertAngleTo360(value:Number):Number{ var number:Number = value; for(var i:Number=0;number>=360;i++){ number -= 360; } for(var j:Number=0;number<0;j++){ number += 360; } return number; } } }