📄 enviroshader.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 + -