package org.papervision3d.core.effects.objects { import flash.display.BlendMode; import flash.display.DisplayObject; import org.papervision3d.core.proto.LightObject3D; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.view.layer.ViewportLayer; public class student_ar_org_papervision3d_core_effects_objects_LensFlare extends ViewportLayer { public var light:LightObject3D; public var flareWidth:Number = 0; public var flareHeight:Number = 0; public var edgeOffset:Number = 1.15; private var flareArray:Array; public function student_ar_org_papervision3d_core_effects_objects_LensFlare(light:LightObject3D, flareArray:Array, width:Number, height:Number, positions:Array = null) { super(null, light, false); this.light = light; flareWidth = width; flareHeight = height; if(positions) this.positions = positions; setFlareArray(flareArray); } public function setFlareArray(flareArray:Array):void{ emptyFlareArray(); this.flareArray = flareArray; buildFlareArray(); } private function emptyFlareArray():void{ for each(var f:DisplayObject in flareArray){ this.removeChild(f); } flareArray = null; } private function buildFlareArray():void{ for each(var f:DisplayObject in flareArray){ this.addChild(f); f.visible = false; f.blendMode = BlendMode.ADD; } } public function updateFlare(showFlare:Boolean = true, testHit:DisplayObject = null):void{ if(showFlare){ //check to see if it hits anything if(testHit){ var lx:Number = int(light.screen.x+flareWidth*0.5); var ly:Number = int(light.screen.y+flareHeight*0.5); if(testHit.hitTestPoint(lx, ly, true)){ hideFlare(); return; } } drawFlare(); }else hideFlare(); } public function hideFlare():void{ for each(var f:DisplayObject in flareArray){ f.visible = false; } } private function drawFlare():void{ //don't draw light if behind camera if(light.screen.z <= 0){ hideFlare(); return; } var w:Number = flareWidth*0.5; var h:Number = flareHeight*0.5; var lx:Number = light.screen.x; var ly:Number = light.screen.y; var alx:Number = Math.abs(lx); var aly:Number = Math.abs(ly); if(alx > w*edgeOffset || aly > h*edgeOffset){ hideFlare(); return; } var distance:Number = Math.sqrt(lx*lx+ly*ly); var angle:Number = Math.atan2(ly, lx); var f:DisplayObject; var pos:Object; var dx:Number; var dy:Number; var scaleX:Number; var scaleY:Number; var scale:Number; for(var i:Number = 0;i