package com.guru.project.papervision3D.element
{
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import org.papervision3d.core.math.Matrix3D;
	import org.papervision3d.events.InteractiveScene3DEvent;
	import org.papervision3d.materials.ColorMaterial;
	import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.objects.primitives.Plane;
	/**
	 * ...
	 * @author Eddy Lee
	 */
	public class RotationalDisplayObject3D extends DisplayObject3D
	{
		private var mCore:DisplayObject3D;
		private var mOuterAxis:Axis3D;
		private var mInnerAxis:Axis3D;
		private var mShowAxis_bol:Boolean;
		private var mRotatable_bol:Boolean;
		private var mDragPlane:Plane;
		
		public function RotationalDisplayObject3D(pRotatable_bol:Boolean = false, pShowAxis_bol:Boolean = false) 
		{
			mShowAxis_bol = pShowAxis_bol;
			mRotatable_bol = pRotatable_bol;
			
			mCore = new DisplayObject3D();
			this.addChild(mCore);
			
			if (mShowAxis_bol)
			{
				mOuterAxis = new Axis3D(15, 150);
				mInnerAxis = new Axis3D(5, 300);
				
				this.addChild(mOuterAxis);
				this.add3DObject(mInnerAxis);
			}
			
			if (mRotatable_bol)
			{
				mDragPlane = new Plane(new ColorMaterial(0xFF0000, 0.3, true));
				mDragPlane.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, onObjectPressHandler);
			}
		}
		
		public function refreshTransform():void
		{
			var reference:Matrix3D = new DisplayObject3D().transform;
			var from:Matrix3D = this.transform;
			var to:Matrix3D = mCore.transform;
			
			mCore.copyTransform(Matrix3D.multiply(to, from));
			
			this.copyTransform(new DisplayObject3D());
		}
		
		public function add3DObject(child:DisplayObject3D, name:String = null):void
		{
			mCore.addChild(child, name);
		}
		
		public function get3DObjectByName(name:String, recursive:Boolean = false):DisplayObject3D 
		{
			return mCore.getChildByName(name, recursive);
		}
		
		private function onObjectPressHandler(e:InteractiveScene3DEvent):void
		{
			trace("onObjectPressHandler: " + e);
			
			Main.getStage().addEventListener(MouseEvent.MOUSE_UP, onMouseUpHandler);
			this.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
		}
		
		private function onMouseUpHandler(e:MouseEvent):void
		{
			trace("onMouseUpHandler: " + e);
			
			Main.getStage().removeEventListener(MouseEvent.MOUSE_UP, onMouseUpHandler);
			this.removeEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
		}
		
		private function onEnterFrameHandler(e:Event):void
		{
			trace("onEnterFrameHandler");
		}
		
	}

}