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

📄 enviroshader.as

📁 著名的flash 3d引擎 away 3d的源代码
💻 AS
字号:
package away3d.materials.shaders{	import away3d.containers.*;	import away3d.core.*;	import away3d.core.base.*;	import away3d.core.draw.*;	import away3d.core.math.*;	import away3d.core.render.*;	import away3d.core.utils.*;		import flash.display.*;	import flash.geom.*;		/**	 * Shader class for environment lighting.	 */    public class EnviroShader extends AbstractShader    {    	use namespace arcane;        /** @private */		arcane var _bitmap:BitmapData;        /** @private */		arcane var _reflectiveness:Number;        /** @private */		arcane var _colorTransform:ColorTransform;        		private var _width:int;		private var _height:int;		private var _halfWidth:int;		private var _halfHeight:int;		private var _enviroTransform:Matrix3D;		private var _specularTransform:Matrix3D;		private var _nFace:Number3D;		private var _nFaceTransZ:Number;		private var specVal1:Number;		private var specVal2:Number;		private var specVal3:Number;		private var specValFace:Number;		private var coeff1:Number;		private var coeff2:Number;		private var coeff3:Number;		private var _sxx:Number;		private var _sxy:Number;		private var _sxz:Number;        private var _syx:Number;        private var _syy:Number;        private var _syz:Number;        private var _szx:Number;        private var _szy:Number;        private var _szz:Number;        		/**		 * @inheritDoc		 */		protected override function clearFaceDictionary(source:Object3D, view:View3D):void        {        	for each (_faceVO in _faceDictionary) {        		if (source == _faceVO.source && view == _faceVO.view) {	        		if (!_faceVO.cleared)	        			_faceVO.clear();	        		_faceVO.invalidated = true;	        	}        	}        }        		/**		 * @inheritDoc		 */        protected override function renderShader(face:Face):void        {			//store a clone			if (_faceVO.cleared && !_parentFaceVO.updated) {				_faceVO.bitmap = _parentFaceVO.bitmap.clone();				_faceVO.bitmap.lock();			}						_faceVO.cleared = false;			_faceVO.updated = true;						_mapping = getMapping(face.parent, face);            _mapping.concat(face._dt.invtexturemapping);            			//draw into faceBitmap			_faceVO.bitmap.draw(_bitmap, _mapping, _colorTransform, blendMode, _faceVO.bitmap.rect, smooth);        }        		/**		 * Setting for possible mapping methods.		 */		public var mode:String;                /**        * Returns the width of the bitmapData being used as the shader environment map.        */        public function get height():Number        {            return _bitmap.height;        }                /**        * Returns the height of the bitmapData being used as the shader environment map.        */		public function get width():Number        {            return _bitmap.width;        }                /**        * Returns the bitmapData object being used as the shader environment map.        */        public function get bitmap():BitmapData        {        	return _bitmap;        }						/**		 * Coefficient for the reflectiveness of the environment map.		 */        public function get reflectiveness():Number        {        	return _reflectiveness;        }                public function set reflectiveness(val:Number):void        {            _reflectiveness = val;            _colorTransform = new ColorTransform(1, 1, 1, _reflectiveness, 0, 0, 0, 0);        }				/**		 * Creates a new <code>EnviroShader</code> object.		 * 		 * @param	bitmap			The bitmapData object to be used as the material's environment map.		 * @param	init	[optional]	An initialisation object for specifying default instance properties.		 */        public function EnviroShader(bitmap:BitmapData, init:Object = null)        {        	super(init);        	            _bitmap = bitmap;                        mode = ini.getString("mode", "linear");            reflectiveness = ini.getNumber("reflectiveness", 0.5, {min:0, max:1});                    	_width = _bitmap.width;        	_height = _bitmap.height;			                        _halfWidth = _width/2;            _halfHeight = _height/2;        }        		/**		 * @inheritDoc		 */		public override function updateMaterial(source:Object3D, view:View3D):void        {        	clearShapeDictionary();        	        	_enviroTransform = source.viewTransform;        	        	if (source.sceneTransformed || source.session.view.camera.sceneTransformed)        		clearFaceDictionary(source, view);        }        		/**		 * @inheritDoc		 */        public override function renderLayer(tri:DrawTriangle, layer:Sprite, level:int):void        {        	super.renderLayer(tri, layer, level);			    		_shape = getShape(layer);        	_shape.blendMode = blendMode;        	_shape.transform.colorTransform = _colorTransform;    					_source.session.renderTriangleBitmap(_bitmap, getMapping(_source, _face), tri.v0, tri.v1, tri.v2, smooth, false, _shape.graphics);						if (debug)                _source.session.renderTriangleLine(0, 0x0000FF, 1, tri.v0, tri.v1, tri.v2);        }        		/**		 * @inheritDoc		 */		public function getMapping(source:Mesh, face:Face):Matrix		{    		_n0 = source.getVertexNormal(face.v0);			_n1 = source.getVertexNormal(face.v1);			_n2 = source.getVertexNormal(face.v2);        				_sxx = _enviroTransform.sxx;			_sxy = _enviroTransform.sxy;			_sxz = _enviroTransform.sxz;						_syx = _enviroTransform.syx;			_syy = _enviroTransform.syy;			_syz = _enviroTransform.syz;						eTri0x = _n0.x * _sxx + _n0.y * _sxy + _n0.z * _sxz;			eTri0y = _n0.x * _syx + _n0.y * _syy + _n0.z * _syz;			eTri1x = _n1.x * _sxx + _n1.y * _sxy + _n1.z * _sxz;			eTri1y = _n1.x * _syx + _n1.y * _syy + _n1.z * _syz;			eTri2x = _n2.x * _sxx + _n2.y * _sxy + _n2.z * _sxz;			eTri2y = _n2.x * _syx + _n2.y * _syy + _n2.z * _syz;						//calulate mapping			_mapping.a = _halfWidth*(eTri1x - eTri0x);			_mapping.b = _halfHeight*(eTri1y - eTri0y);			_mapping.c = _halfWidth*(eTri2x - eTri0x);			_mapping.d = _halfHeight*(eTri2y - eTri0y);			_mapping.tx = _halfWidth*eTri0x + _halfWidth;			_mapping.ty = _halfHeight*eTri0y + _halfHeight;            _mapping.invert();                        return _mapping;		}    }}

⌨️ 快捷键说明

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