📄 face.as
字号:
package away3d.core.base{ import away3d.core.*; import away3d.core.draw.*; import away3d.core.math.*; import away3d.core.render.*; import away3d.core.utils.*; import away3d.events.*; import away3d.materials.*; import flash.events.Event; import flash.geom.*; /** * Dispatched when the uv mapping of the face changes. * * @eventType away3d.events.FaceEvent */ [Event(name="mappingchanged",type="away3d.events.FaceEvent")] /** * Dispatched when the material of the face changes. * * @eventType away3d.events.FaceEvent */ [Event(name="materialchanged",type="away3d.events.FaceEvent")] /** * A triangle element used in the mesh object * * @see away3d.core.base.Mesh */ public class Face extends BaseMeshElement { use namespace arcane; /** @private */ arcane var _v0:Vertex; /** @private */ arcane var _v1:Vertex; /** @private */ arcane var _v2:Vertex; /** @private */ arcane var _uv0:UV; /** @private */ arcane var _uv1:UV; /** @private */ arcane var _uv2:UV; /** @private */ arcane var _material:ITriangleMaterial; /** @private */ arcane var _back:ITriangleMaterial; /** @private */ arcane var _dt:DrawTriangle = new DrawTriangle(); /** @private */ arcane var bitmapRect:Rectangle; /** @private */ arcane function front(projection:Projection):Number { var sv0:ScreenVertex = _v0.project(projection); var sv1:ScreenVertex = _v1.project(projection); var sv2:ScreenVertex = _v2.project(projection); return (sv0.x*(sv2.y - sv1.y) + sv1.x*(sv0.y - sv2.y) + sv2.x*(sv1.y - sv0.y)); } /** @private */ arcane function notifyMaterialChange():void { _dt.texturemapping = null; if (!hasEventListener(FaceEvent.MATERIAL_CHANGED)) return; if (_materialchanged == null) _materialchanged = new FaceEvent(FaceEvent.MATERIAL_CHANGED, this); dispatchEvent(_materialchanged); } /** @private */ arcane function notifyMappingChange():void { _dt.texturemapping = null; if (!hasEventListener(FaceEvent.MAPPING_CHANGED)) return; if (_mappingchanged == null) _mappingchanged = new FaceEvent(FaceEvent.MAPPING_CHANGED, this); dispatchEvent(_mappingchanged); } private var _normal:Number3D = new Number3D(); private var _normalDirty:Boolean = true; private var _a:Number; private var _b:Number; private var _c:Number; private var _s:Number; private var _mappingchanged:FaceEvent; private var _materialchanged:FaceEvent; private function onMaterialResize(event:MaterialEvent):void { _dt.texturemapping = null; } //TODO: simplify vertex changed events /* private function onVertexChange(event:Event):void { _normal = null; notifyVertexChange(); } */ private function onVertexValueChange(event:Event):void { _normalDirty = true; notifyVertexValueChange(); } private function onUVChange(event:Event):void { notifyMappingChange(); } /** * An optional untyped object that can contain used-defined properties. */ public var extra:Object; /** * Defines the parent 3d object of the face. */ public var parent:Mesh; /** * Returns an array of vertex objects that are used by the face. */ public override function get vertices():Array { return [_v0, _v1, _v2]; } /** * Returns an array of uv objects that are used by the face. */ public function get uvs():Array { return [_uv0, _uv1, _uv2]; } /** * Defines the v0 vertex of the face. */ public function get v0():Vertex { return _v0; } public function set v0(value:Vertex):void { if (value == _v0) return; if (_v0 != null) if ((_v0 != _v1) && (_v0 != _v2)) _v0.removeOnChange(onVertexValueChange); _v0 = value; if (_v0 != null) if ((_v0 != _v1) && (_v0 != _v2)) _v0.addOnChange(onVertexValueChange); notifyVertexChange(); } /** * Defines the v1 vertex of the face. */ public function get v1():Vertex { return _v1; } public function set v1(value:Vertex):void { if (value == _v1) return; if (_v1 != null) if ((_v1 != _v0) && (_v1 != _v2)) _v1.removeOnChange(onVertexValueChange); _v1 = value; if (_v1 != null) if ((_v1 != _v0) && (_v1 != _v2)) _v1.addOnChange(onVertexValueChange); notifyVertexChange(); } /** * Defines the v2 vertex of the face. */ public function get v2():Vertex { return _v2; } public function set v2(value:Vertex):void { if (value == _v2) return; if (_v2 != null) if ((_v2 != _v1) && (_v2 != _v0)) _v2.removeOnChange(onVertexValueChange); _v2 = value; if (_v2 != null) if ((_v2 != _v1) && (_v2 != _v0)) _v2.addOnChange(onVertexValueChange); notifyVertexChange(); } /** * Defines the material of the face. */ public function get material():ITriangleMaterial { return _material; } public function set material(value:ITriangleMaterial):void { if (value == _material) return; if (_material != null && _material is IUVMaterial) (_material as IUVMaterial).removeOnResize(onMaterialResize); _material = value; if (_material != null && _material is IUVMaterial) (_material as IUVMaterial).addOnResize(onMaterialResize); notifyMaterialChange(); } /** * Defines the optional back material of the face. * Displays when the face is pointing away from the camera. */ public function get back():ITriangleMaterial { return _back; } public function set back(value:ITriangleMaterial):void { if (value == _back) return; _back = value; // notifyBackChange(); TODO } /** * Defines the uv0 coordinate of the face. */ public function get uv0():UV { return _uv0; } public function set uv0(value:UV):void { if (value == _uv0) return; if (_uv0 != null) if ((_uv0 != _uv1) && (_uv0 != _uv2)) _uv0.removeOnChange(onUVChange); _uv0 = value; if (_uv0 != null) if ((_uv0 != _uv1) && (_uv0 != _uv2)) _uv0.addOnChange(onUVChange); notifyMappingChange(); } /** * Defines the uv1 coordinate of the face. */ public function get uv1():UV { return _uv1; } public function set uv1(value:UV):void { if (value == _uv1) return; if (_uv1 != null) if ((_uv1 != _uv0) && (_uv1 != _uv2)) _uv1.removeOnChange(onUVChange); _uv1 = value; if (_uv1 != null) if ((_uv1 != _uv0) && (_uv1 != _uv2)) _uv1.addOnChange(onUVChange); notifyMappingChange(); } /** * Defines the uv2 coordinate of the face. */ public function get uv2():UV { return _uv2; } public function set uv2(value:UV):void { if (value == _uv2) return; if (_uv2 != null) if ((_uv2 != _uv1) && (_uv2 != _uv0)) _uv2.removeOnChange(onUVChange); _uv2 = value; if (_uv2 != null) if ((_uv2 != _uv1) && (_uv2 != _uv0)) _uv2.addOnChange(onUVChange); notifyMappingChange(); } /** * Returns the calculated 2 dimensional area of the face. */ public function get area():Number { // not quick enough _a = v0.position.distance(v1.position); _b = v1.position.distance(v2.position); _c = v2.position.distance(v0.position); _s = (_a + _b + _c) / 2; return Math.sqrt(_s*(_s - _a)*(_s - _b)*(_s - _c)); } /** * Returns the normal vector of the face. */ public function get normal():Number3D
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -