⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 viewportlayer.as

📁 Papervision3d的源码
💻 AS
字号:
package org.papervision3d.view.layer {	import flash.display.Graphics;	import flash.display.Sprite;	import flash.utils.Dictionary;		import org.papervision3d.core.ns.pv3dview;	import org.papervision3d.core.render.command.RenderableListItem;	import org.papervision3d.objects.DisplayObject3D;	import org.papervision3d.view.Viewport3D;	import org.papervision3d.view.layer.util.ViewportLayerSortMode;		/**	 * @Author Ralph Hauwert	 */	public class ViewportLayer extends Sprite	{		use namespace pv3dview;				public var childLayers			:Array;		public var layers				:Dictionary = new Dictionary(true);		protected var viewport			:Viewport3D;		public var displayObject3D		:DisplayObject3D;		public var displayObjects		:Dictionary = new Dictionary(true);				public var layerIndex			:Number;		public var forceDepth			:Boolean = false;		public var screenDepth			:Number = 0;		public var weight				:Number = 0;		public var sortMode				:String = ViewportLayerSortMode.Z_SORT;		public var dynamicLayer			:Boolean = false;		public var graphicsChannel		:Graphics;				public function ViewportLayer(viewport:Viewport3D, do3d:DisplayObject3D, isDynamic:Boolean = false)		{			super();			this.viewport = viewport;			this.displayObject3D = do3d;			this.dynamicLayer = isDynamic;			this.graphicsChannel = this.graphics;									if(isDynamic){				this.filters = do3d.filters;				this.blendMode = do3d.blendMode;				this.alpha = do3d.alpha;			}						if(do3d)				addDisplayObject3D(do3d);										init();		}				public function addDisplayObject3D(do3d:DisplayObject3D, recurse:Boolean = false):void{						if(!do3d) return;						displayObjects[do3d] = do3d;			dispatchEvent(new ViewportLayerEvent(ViewportLayerEvent.CHILD_ADDED, do3d, this));						if(recurse)				do3d.addChildrenToLayer(do3d, this);		}				public function removeDisplayObject3D(do3d:DisplayObject3D):void{			displayObjects[do3d] = null;			dispatchEvent(new ViewportLayerEvent(ViewportLayerEvent.CHILD_REMOVED, do3d, this));		}				public function hasDisplayObject3D(do3d:DisplayObject3D):Boolean{			return (displayObjects[do3d] != null);		}				protected function init():void		{			childLayers = new Array();		}				public function getChildLayer(do3d:DisplayObject3D, createNew:Boolean = true, recurse:Boolean = false):ViewportLayer{						do3d = do3d.parentContainer?do3d.parentContainer:do3d;							/* var index:Number = childLayerIndex(do3d);						if(index > -1)				return childLayers[index];						for each(var vpl:ViewportLayer in childLayers){				var tmpLayer:ViewportLayer = vpl.getChildLayer(do3d, false);				if(tmpLayer)					return tmpLayer;			}				 */			 			if(layers[do3d]){				return layers[do3d];			}							 			//no layer found = return a new one			if(createNew)				return getChildLayerFor(do3d, recurse);			else				return null;		}				protected function getChildLayerFor(displayObject3D:DisplayObject3D, recurse:Boolean = false):ViewportLayer		{						if(displayObject3D){				var vpl:ViewportLayer = new ViewportLayer(viewport,displayObject3D, displayObject3D.useOwnContainer);				addLayer(vpl);				if(recurse)					displayObject3D.addChildrenToLayer(displayObject3D, vpl);								return vpl;			}else{				trace("Needs to be a do3d");			}			return null;		}				public function childLayerIndex(do3d:DisplayObject3D):Number{						do3d = do3d.parentContainer?do3d.parentContainer:do3d;						for(var i:int=0;i<childLayers.length;i++){				if(childLayers[i].hasDisplayObject3D(do3d)){					return i;				}			}			return -1;		}				public function addLayer(vpl:ViewportLayer):void{						var do3d:DisplayObject3D;						childLayers.push(vpl);			addChild(vpl);						vpl.addEventListener(ViewportLayerEvent.CHILD_ADDED, onChildAdded);			vpl.addEventListener(ViewportLayerEvent.CHILD_REMOVED, onChildRemoved);						for each(do3d in vpl.displayObjects){				linkChild(do3d, vpl);			}						for each(var v:ViewportLayer in vpl.layers){				for each(do3d in v.displayObjects){					linkChild(do3d, v);				}			}		}				private function linkChild(do3d:DisplayObject3D, vpl:ViewportLayer, e:ViewportLayerEvent = null):void{						layers[do3d] = vpl;			dispatchEvent(new ViewportLayerEvent(ViewportLayerEvent.CHILD_ADDED, do3d, vpl));					}				private function unlinkChild(do3d:DisplayObject3D, e:ViewportLayerEvent = null):void{			layers[do3d ] = null;			dispatchEvent(new ViewportLayerEvent(ViewportLayerEvent.CHILD_REMOVED, do3d));		}				private function onChildAdded(e:ViewportLayerEvent):void{			if(e.do3d){				linkChild(e.do3d, e.layer, e);			}		}				private function onChildRemoved(e:ViewportLayerEvent):void{			if(e.do3d){				unlinkChild(e.do3d, e);			}		}				public function updateBeforeRender():void{			clear();			for each(var vpl:ViewportLayer in childLayers){				vpl.updateBeforeRender();			}		}				public function updateAfterRender():void{			for each(var vpl:ViewportLayer in childLayers){				vpl.updateAfterRender();			}		}				public function removeLayer(vpl:ViewportLayer):void{						var index:int = getChildIndex(vpl);			if(index >-1){				removeLayerAt(index);			}else{				trace("Layer not found for removal.");			}		}				public function removeLayerAt(index:Number):void{						for each(var do3d:DisplayObject3D in childLayers[index].displayObjects){				unlinkChild(do3d);			}			removeChild(childLayers[index]);			childLayers.splice(index, 1);					}				public function getLayerObjects(ar:Array = null):Array{					if(!ar)				ar = new Array();			for each(var do3d:DisplayObject3D in this.displayObjects){				if(do3d && do3d.parent == null){					ar.push(do3d);				}			}						for each(var vpl:ViewportLayer in childLayers){				vpl.getLayerObjects(ar);			}												return ar;					}								public function clear():void		{							/* var vpl:ViewportLayer;			for each(vpl in childLayers){								vpl.clear();			} */			graphicsChannel.clear();			reset();		}				protected function reset():void{						if( !forceDepth)				screenDepth = 0;							this.weight = 0;					}				public function sortChildLayers():void{											if(sortMode == ViewportLayerSortMode.Z_SORT){				childLayers.sortOn("screenDepth", Array.DESCENDING | Array.NUMERIC);			}else{				childLayers.sortOn("layerIndex", Array.NUMERIC);			}						orderLayers();		}				protected function orderLayers():void{			//trace("---------", childLayers.length);			for(var i:int = 0;i<childLayers.length;i++){				this.setChildIndex(childLayers[i], i);				childLayers[i].sortChildLayers();			}		}				public function processRenderItem(rc:RenderableListItem):void{			if(!forceDepth){				this.screenDepth += rc.screenDepth;				this.weight++;			}		}				public function updateInfo():void{						//this.screenDepth /= this.weight;						for each(var vpl:ViewportLayer in childLayers){				vpl.updateInfo();				if(!forceDepth){					this.weight += vpl.weight;					this.screenDepth += (vpl.screenDepth*vpl.weight);				}			}						if(!forceDepth)				this.screenDepth /= this.weight;							}				public function removeAllLayers():void{			for(var i:int=childLayers.length-1;i>=0;i--){				removeLayerAt(i);			}		}			}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -