亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? md2.as

?? Papervision3d的源碼
?? AS
字號(hào):
package org.papervision3d.objects.parsers {
	import flash.events.Event;
	import flash.events.ProgressEvent;
	import flash.net.URLLoader;
	import flash.net.URLLoaderDataFormat;
	import flash.net.URLRequest;
	import flash.utils.ByteArray;
	import flash.utils.Endian;
	import flash.utils.getTimer;
	
	import org.papervision3d.Papervision3D;
	import org.papervision3d.core.animation.*;
	import org.papervision3d.core.animation.channel.*;
	import org.papervision3d.core.geom.TriangleMesh3D;
	import org.papervision3d.core.geom.renderables.*;
	import org.papervision3d.core.math.NumberUV;
	import org.papervision3d.core.proto.MaterialObject3D;
	import org.papervision3d.core.render.data.RenderSessionData;
	import org.papervision3d.events.FileLoadEvent;
	import org.papervision3d.objects.DisplayObject3D;	

	/**
	 * Loads Quake 2 MD2 file with animation!
	 * </p>Please feel free to use, but please mention me!</p>
	 * 
	 * @author Philippe Ajoux (philippe.ajoux@gmail.com) adapted by Tim Knip(tim.knip at gmail.com).
	 * @website www.d3s.net
	 * @version 04.11.07:11:56
	 */
	public class MD2 extends TriangleMesh3D implements IAnimationDataProvider, IAnimatable
	{
		/**
		 * Variables used in the loading of the file
		 */
		private var file:String;
		private var loader:URLLoader;
		private var loadScale:Number;
		
		/**
		 * MD2 Header data
		 * These are all the variables found in the md2_header_t
		 * C style struct that starts every MD2 file.
		 */
		private var ident:int, version:int;
		private var skinwidth:int, skinheight:int;
		private var framesize:int;
		private var num_skins:int, num_vertices:int, num_st:int;
		private var num_tris:int, num_glcmds:int, num_frames:int;
		private var offset_skins:int, offset_st:int, offset_tris:int;
		private var offset_frames:int, offset_glcmds:int, offset_end:int;
		private var _fps:int;
		private var _autoPlay:Boolean;
		
		/**
		 * Constructor.
		 * 
		 * @param	autoPlay	Whether to start the animation automatically.
		 */
		public function MD2(autoPlay:Boolean=true):void
		{
			super(null, new Array(), new Array());
			
			_autoPlay = autoPlay;
		}
		
		/**
		 * Plays the animation.
		 * 
		 * @param 	clip	Optional clip name.
		 */ 
		public function play(clip:String=null):void
		{
			if(clip && _channelByName[clip])
			{
				_currentChannel = _channelByName[clip];
			}
			else if(_channels && _channels.length)
			{
				_currentChannel = _channels[0];
			}
			else
			{
				_isPlaying = false;
				Papervision3D.log("[MD2 ERROR] Can't find a animation channel to play!");
				return;
			}
			
			_currentTime = getTimer();
			_isPlaying = true;
		}
		
		/**
		 * Stops the animation.
		 */ 
		public function stop():void
		{
			_isPlaying = false;
		}
		
		/**
		 * Gets the default FPS.
		 */ 
		public function get fps():uint
		{
			return _fps;
		}
		
		/**
		 * Gets a animation channel by its name.
		 * 
		 * @param	name
		 * 
		 * @return the found channel.
		 */ 
		public function getAnimationChannelByName(name:String):AbstractChannel3D
		{
			return _channelByName[name];	
		}
		
		/**
		 * Gets all animation channels for a target. NOTE: when target is null, 'this' object is used.
		 * 
		 * @param	target	The target to get the channels for.
		 * 
		 * @return	Array of AnimationChannel3D.
		 */ 
		public function getAnimationChannels(target:DisplayObject3D=null):Array
		{
			target = target || this;
			if(target === this)
			{
				return [_channels[0]];
			}
			return null;
		}
		
		/**
		 * Gets animation channels by clip name.
		 * 
		 * @param	name	The clip name
		 * 
		 * @return	Array of AnimationChannel3D.
		 */ 
		public function getAnimationChannelsByClip(name:String):Array
		{
			if(_channelByName[name])
				return [_channelByName[name]];
			return null;	
		}
		
		/**
		 * Loads the MD2.
		 * 
		 * @param	asset	URL or ByteArray
		 * @param	material	The material for the MD2
		 * @param	fps		Frames per second
		 * @param	scale	Scale
		 */
		public function load(asset:*, material:MaterialObject3D = null, fps:int = 6, scale:Number = 1):void
		{
			this.loadScale = scale;
			this._fps = fps;
			this.visible = false;
			this.material = material || MaterialObject3D.DEFAULT;
			
			if(asset is ByteArray)
			{
				this.file = "";
				parse(asset as ByteArray);
			}
			else
			{
				this.file = String(asset);
				
				loader = new URLLoader();
				loader.dataFormat = URLLoaderDataFormat.BINARY;
				loader.addEventListener(Event.COMPLETE, loadCompleteHandler);
				loader.addEventListener(ProgressEvent.PROGRESS, loadProgressHandler);
				
				try
				{
		            loader.load(new URLRequest(this.file));
				}
				catch(e:Error)
				{
					Papervision3D.log("error in loading MD2 file (" + this.file + ")");
				}
			}
		}
		
		/**
		 * Project.
		 * 
		 * @param	parent
		 * @param	renderSessionData
		 * 
		 * @return	Number
		 */ 
		public override function project(parent:DisplayObject3D, renderSessionData:RenderSessionData):Number
		{
			if(_isPlaying && _currentChannel)
			{
				var secs:Number = _currentTime / 1000;
				var duration:Number = _currentChannel.duration;
				var elapsed:Number = (getTimer()/1000) - secs;
				
				if(elapsed > duration)
				{
					_currentTime = getTimer();
					secs = _currentTime / 1000;
					elapsed = 0;
				}
				var time:Number = elapsed / duration;
				
				_currentChannel.updateToTime(time);
			}
			
			return super.project(parent, renderSessionData);
		}
		
		/**
		 * <p>Parses the MD2 file. This is actually pretty straight forward.
		 * Only complicated parts (bit convoluded) are the frame loading
		 * and "metaface" loading. Hey, it works, use it =)</p>
		 * 
		 * @param	data	A ByteArray
		 */
		private function parse(data:ByteArray):void
		{
			var i:int, j:int, uvs:Array = new Array();
			var metaface:Object;
			data.endian = Endian.LITTLE_ENDIAN;
			
			_channels = new Array();
			_channelByName = new Object();
			
			// Read the header and make sure it is valid MD2 file
			readMd2Header(data);
			if (ident != 844121161 || version != 8)
				throw new Error("error loading MD2 file (" + file + "): Not a valid MD2 file/bad version");
				
			//---Vertice setup
			// be sure to allocate memory for the vertices to the object
			for (i = 0; i < num_vertices; i++)
				geometry.vertices.push(new Vertex3D());

			//---UV coordinates
			data.position = offset_st;
			for (i = 0; i < num_st; i++)
			{
				var uv:NumberUV = new NumberUV(data.readShort() / skinwidth, data.readShort() / skinheight);
				//uv.u = 1 - uv.u;
				uv.v = 1 - uv.v;
				uvs.push(uv);
			}

			//---Frame animation data
			data.position = offset_frames;
			readFrames(data);
			
			//---Faces
			// make sure to push the faces with allocated vertices to the object!
			data.position = offset_tris;
			for (i = 0; i < num_tris; i++)
			{
				metaface = {a: data.readUnsignedShort(), b: data.readUnsignedShort(), c: data.readUnsignedShort(),
					        ta: data.readUnsignedShort(), tb: data.readUnsignedShort(), tc: data.readUnsignedShort()};
				
				var v0:Vertex3D = geometry.vertices[metaface.a];
				var v1:Vertex3D = geometry.vertices[metaface.b];
				var v2:Vertex3D = geometry.vertices[metaface.c];
				
				var uv0:NumberUV = uvs[metaface.ta];
				var uv1:NumberUV = uvs[metaface.tb];
				var uv2:NumberUV = uvs[metaface.tc];

				geometry.faces.push(new Triangle3D(this, [v0, v1, v2], material, [uv0, uv1, uv2]));
			}
			
			geometry.ready = true;
	
			visible = true;
						
			Papervision3D.log("Parsed MD2: " + file + "\n vertices:" + 
							  geometry.vertices.length + "\n texture vertices:" + uvs.length +
							  "\n faces:" + geometry.faces.length + "\n frames: " + num_frames);

			dispatchEvent(new FileLoadEvent(FileLoadEvent.LOAD_COMPLETE, this.file));
			dispatchEvent(new FileLoadEvent(FileLoadEvent.ANIMATIONS_COMPLETE, this.file));
			
			if(_autoPlay)
				play();
		}
		
		/**
		 * Reads in all the frames
		 */
		private function readFrames(data:ByteArray):void
		{
			var sx:Number, sy:Number, sz:Number;
			var tx:Number, ty:Number, tz:Number;
			var verts:Array
			var i:int, j:int, char:int;
			var duration:Number = 1 / _fps;
			
			var channel:AbstractChannel3D = new MorphChannel3D(this, "all");
			
			var t:uint = 0;
			
			var curName:String = "all";
			var clip:AbstractChannel3D;
			var clipPos:int = 0;
			
			for (i = 0; i < num_frames; i++)
			{				
				sx = data.readFloat();
				sy = data.readFloat();
				sz = data.readFloat();
				
				tx = data.readFloat();
				ty = data.readFloat();
				tz = data.readFloat();
				
				var frameName:String = "";
				
				for (j = 0; j < 16; j++)
					if ((char = data.readUnsignedByte()) != 0)
						frameName += String.fromCharCode(char);
				
				var shortName:String = frameName.replace(/\d+/, "");
				
				if(curName != shortName)
				{
					if(clip)
					{
						_channels.push(clip);
						_channelByName[clip.name] = clip;
					}
					
					clip = new MorphChannel3D(this, shortName);
					curName = shortName;
					clipPos = 0;
				}
				
				var vertices:Array = new Array();

				// Note, the extra data.position++ in the for loop is there 
				// to skip over a byte that holds the "vertex normal index"
				for (j = 0; j < num_vertices; j++, data.position++)
				{
					var v:Vertex3D = new Vertex3D(
						((sx * data.readUnsignedByte()) + tx) * loadScale, 
						((sy * data.readUnsignedByte()) + ty) * loadScale,
						((sz * data.readUnsignedByte()) + tz) * loadScale);
						
					if( i == 1 )
					{
						this.geometry.vertices[j].x = v.x;
						this.geometry.vertices[j].y = v.y;
						this.geometry.vertices[j].z = v.z;
					}
					
					vertices.push(v);
				}
				
				clip.addKeyFrame(new AnimationKeyFrame3D(frameName, clipPos * duration, vertices));
				
				channel.addKeyFrame(new AnimationKeyFrame3D(frameName, i * duration, vertices));
				
				clipPos++;
			}
			
			_channels.unshift(channel);
			_channelByName[channel.name] = channel;
			
			if(clip)
			{
				_channels.push(clip);
				_channelByName[clip.name] = clip;
			}
		}
		
		/**
		 * Reads in all that MD2 Header data that is declared as private variables.
		 * I know its a lot, and it looks ugly, but only way to do it in Flash
		 */
		private function readMd2Header(data:ByteArray):void
		{
			ident = data.readInt();
			version = data.readInt();
			skinwidth = data.readInt();
			skinheight = data.readInt();
			framesize = data.readInt();
			num_skins = data.readInt();
			num_vertices = data.readInt();
			num_st = data.readInt();
			num_tris = data.readInt();
			num_glcmds = data.readInt();
			num_frames = data.readInt();
			offset_skins = data.readInt();
			offset_st = data.readInt();
			offset_tris = data.readInt();
			offset_frames = data.readInt();
			offset_glcmds = data.readInt();
			offset_end = data.readInt();
		}

		/**
		 * 
		 */ 
		private function loadCompleteHandler(event:Event):void
		{
			var loader:URLLoader = event.target as URLLoader;
			var data:ByteArray = loader.data;
			parse(data);
		}
		
		/**
		 * 
		 * @param	event
		 * @return
		 */
		private function loadProgressHandler( event:ProgressEvent ):void
		{
			dispatchEvent(event);
		}
		
		private var _channels:Array;
		private var _channelByName:Object;
		
		private var _isPlaying:Boolean = false;
		private var _currentChannel:AbstractChannel3D;
		private var _currentTime:Number = 0;
	}
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美一区二区精品婷婷| 成人国产精品免费观看| 色噜噜狠狠成人中文综合| 久久久午夜精品理论片中文字幕| 亚洲精品亚洲人成人网| 国产一区二区三区黄视频| 欧美精品1区2区| 亚洲第一二三四区| 欧美在线观看你懂的| 亚洲欧美日韩系列| www.日韩av| 亚洲欧洲日本在线| 91丝袜美腿高跟国产极品老师| 欧美激情综合五月色丁香小说| 日本三级亚洲精品| 欧美一级日韩免费不卡| 午夜av一区二区| 欧美一区二区三区精品| 秋霞成人午夜伦在线观看| 日韩欧美亚洲一区二区| 青青草国产精品亚洲专区无| 日韩三级免费观看| 国内久久精品视频| 国产亚洲欧美日韩俺去了| 国产乱码精品1区2区3区| 国产欧美久久久精品影院| 东方aⅴ免费观看久久av| 中文字幕在线不卡视频| 91久久精品一区二区三区| 五月综合激情婷婷六月色窝| 91精品欧美综合在线观看最新| 美女视频黄 久久| 久久久不卡网国产精品一区| 粉嫩av一区二区三区粉嫩| 亚洲乱码中文字幕综合| 欧美蜜桃一区二区三区| 国产一区二区电影| 亚洲精品成人悠悠色影视| 91精品蜜臀在线一区尤物| 国产精品一区二区三区乱码 | 日韩一区二区在线观看| 狠狠狠色丁香婷婷综合激情| 中文字幕在线一区| 91精品欧美综合在线观看最新| 国产精品一区在线| 亚洲高清免费视频| 欧美激情在线一区二区三区| 欧美午夜精品免费| 国产精品18久久久久久久久| 亚洲一区二区三区小说| 久久久五月婷婷| 欧美日韩一区二区欧美激情 | 亚洲自拍与偷拍| 久久午夜老司机| 欧美一二三区在线| 91精品91久久久中77777| 国内成人精品2018免费看| 亚洲国产综合在线| 亚洲视频一区二区在线观看| 精品福利av导航| 欧美一级搡bbbb搡bbbb| 欧美日韩视频专区在线播放| av在线不卡观看免费观看| 国产精品伊人色| 韩国女主播一区| 精品一区二区三区日韩| 秋霞电影一区二区| 免费在线观看一区| 三级不卡在线观看| 香蕉成人啪国产精品视频综合网| 一区二区三区精品视频| 18欧美乱大交hd1984| 中文字幕一区日韩精品欧美| 日本一二三四高清不卡| 国产亚洲精品久| 国产日产欧美一区二区视频| 久久看人人爽人人| 中文子幕无线码一区tr| 国产欧美精品区一区二区三区| 久久久精品国产免费观看同学| 国产日韩欧美综合在线| 国产精品网站在线| 有码一区二区三区| 香蕉成人啪国产精品视频综合网| 日韩精品一级二级| 黄色精品一二区| 成人av在线网| 欧美三级日韩在线| 欧美mv日韩mv国产网站app| 2023国产一二三区日本精品2022| 亚洲三级在线播放| 亚洲观看高清完整版在线观看| 免费观看日韩av| 粉嫩av一区二区三区在线播放| 91视频观看视频| 91精品国产色综合久久不卡蜜臀| 欧美精品一区二| 亚洲日本电影在线| 久久精品国产一区二区三区免费看| 国产精品一二三四五| 在线看一区二区| 欧美精品一区二区高清在线观看| 中文字幕一区二区三区av| 亚洲国产精品综合小说图片区| 精品夜夜嗨av一区二区三区| 97精品久久久久中文字幕 | 激情综合五月婷婷| 日本电影亚洲天堂一区| 日韩欧美电影在线| 一区二区三区久久| 日韩福利电影在线| 91在线精品秘密一区二区| 欧美一区二区三区日韩视频| 欧美激情在线一区二区三区| 亚洲大片免费看| av电影天堂一区二区在线| 欧美午夜不卡视频| 国产精品久久久久久久久快鸭| 午夜久久久久久久久久一区二区| 国产91色综合久久免费分享| 9191精品国产综合久久久久久 | 日本美女一区二区三区视频| 99精品欧美一区二区蜜桃免费 | 欧美精品在线观看播放| 亚洲桃色在线一区| 激情国产一区二区| 亚洲视频在线一区二区| 国产精品一区专区| 欧美xxxxx牲另类人与| 偷拍一区二区三区| 欧美浪妇xxxx高跟鞋交| 亚洲欧美日韩国产手机在线| 国产经典欧美精品| 精品精品欲导航| 国内外精品视频| 国产亚洲一区二区在线观看| 精品一区二区日韩| 精品精品国产高清一毛片一天堂| 日本午夜一本久久久综合| 色先锋资源久久综合| 一区二区三区电影在线播| 色av成人天堂桃色av| 亚洲青青青在线视频| 成人精品免费看| 亚洲欧洲99久久| 丁香桃色午夜亚洲一区二区三区| 精品欧美久久久| 国产大陆a不卡| 亚洲国产成人午夜在线一区| 播五月开心婷婷综合| 亚洲精品国产一区二区三区四区在线| 高清免费成人av| 国产视频911| 99精品视频在线免费观看| 亚洲一区二区三区美女| 日韩亚洲欧美一区| 风间由美中文字幕在线看视频国产欧美| 中文字幕第一页久久| 日本高清不卡在线观看| 日韩二区在线观看| 国产欧美日本一区二区三区| 色综合久久久久| 免费黄网站欧美| 综合激情网...| 亚洲综合视频在线| 欧美美女喷水视频| 不卡的电视剧免费网站有什么| 亚洲最新在线观看| 欧美精品一区二区在线观看| 91黄色小视频| 高清免费成人av| 国内偷窥港台综合视频在线播放| 日韩伦理电影网| 欧美一区二区三区在线电影| 国产精品影视在线| 伊人色综合久久天天| 中文字幕av一区 二区| 欧美成人video| 欧美三级欧美一级| 91在线播放网址| 国产夫妻精品视频| 蜜桃精品视频在线观看| 国产精品视频免费| 国产视频一区在线观看| 欧美一区二区三区免费观看视频| 色婷婷一区二区三区四区| 久久66热偷产精品| 六月婷婷色综合| 美女性感视频久久| 午夜国产不卡在线观看视频| 亚洲日本一区二区三区| 日韩久久一区二区| 中文字幕av不卡| 国产精品免费视频网站| 久久精品一区四区| 国产日韩欧美高清在线| 欧美电视剧在线观看完整版| 欧美刺激脚交jootjob| 精品日韩在线观看| 26uuu精品一区二区在线观看|