package { /** * @author nicoptere */ import flash.events.MouseEvent; import flash.display.MovieClip; import flash.display.Shape; import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.StageScaleMode; import fl.controls.Button; import flash.geom.Matrix; import flash.geom.Point; public class Gradient extends MovieClip { private var tab:Array; private var bd:BitmapData; private var bmp:Bitmap; private var canvas:Shape; private var showHide:Boolean = true; private var renderMode:String = 'GRADIENT'; public function Gradient() { stage.scaleMode = StageScaleMode.NO_SCALE; init(); } public function init():void { //graphic resource bd = new Image( 0,0 ); bmp = new Bitmap( bd ); bmp.alpha = .2; addChild( bmp ); canvas = new Shape() addChild( canvas ); /*****************************************************/ //render button var showHideBtn:Button = new Button(); showHideBtn.label = 'render'; showHideBtn.width = 100; showHideBtn.addEventListener( MouseEvent.CLICK, showHideHandler ); addChild( showHideBtn ); //render mode button var renderModeBtn:Button = new Button(); renderModeBtn.label = renderMode; renderModeBtn.width = 100; renderModeBtn.x = 100; renderModeBtn.addEventListener( MouseEvent.CLICK, renderModeHandler ); addChild( renderModeBtn ); //reset button var resetBtn:Button = new Button(); resetBtn.label = 'RESET'; resetBtn.x = 200; resetBtn.addEventListener( MouseEvent.CLICK, resetHandler ); addChild( resetBtn ); /*****************************************************/ tab = new Array(); stage.addEventListener( MouseEvent.MOUSE_DOWN, mouseDownHandler ); } private function resetHandler ( e:MouseEvent ):void { tab = []; canvas.graphics.clear(); } //switch the render on / off public function showHideHandler( e:MouseEvent ):void { showHide = !showHide ? true : false; if( showHide ) { bmp.alpha = .2; }else{ bmp.alpha = 1; } render(); } //switch the render on / off public function renderModeHandler( e:MouseEvent ):void { if( renderMode == 'GRADIENT' ) { renderMode = 'WIREFRAME'; (e.target as Button ).label = renderMode; }else if( renderMode == 'FLAT') { renderMode = 'GRADIENT'; (e.target as Button ).label = renderMode; }else{ renderMode = 'FLAT'; (e.target as Button ).label = renderMode; } render(); } //adds point on Click on the stage public function mouseDownHandler ( e:MouseEvent ):void { if(e.target is Button )return; var deletion:Boolean = false; var i:int; var dx:Number; var dy:Number; var dist:Number; var p:Point for ( i = 0; i < tab.length; i++ ) { p = tab[ i ] as Point; dx = p.x - mouseX; dy = p.y - mouseY; dist = Math.sqrt( dx*dx + dy*dy ); if( dist < 5 ) { tab.splice( i, 1 ); deletion = true; } } if( !deletion ) { tab.push( new Point( mouseX, mouseY ) ); } render(); } //render function function render():void { //refreshes the bitmap canvas.graphics.clear(); //renders or not the delaunay triangles if( showHide ) { //renders the set of Points var delaunay:Array = Delaunay.Triangulate( tab ); var i:int; var t:Triangle; var cx:Number; var cy:Number; var graf:BitmapData var col_0:uint; var col_1:uint; var col_2:uint; var m:Matrix = new Matrix(); var pt:Point = new Point(0,0); var minP:Point; var maxP:Point; var miny:Number; var maxy:Number; var type:String = 'linear'; var len:uint = 255; switch( renderMode ) { case 'WIREFRAME': for ( i = 0; i < delaunay.length; i++ ) { t = ( delaunay[ i ] as Triangle ); t.getCenter(); col_0 = bd.getPixel32( t.center.x, t.center.y ); canvas.graphics.lineStyle( .5, col_0, 1 ); canvas.graphics.moveTo(t.p1.x, t.p1.y); canvas.graphics.lineTo(t.p2.x, t.p2.y); canvas.graphics.lineTo(t.p3.x, t.p3.y); canvas.graphics.lineTo(t.p1.x, t.p1.y); } break; case 'FLAT': for ( i = 0; i < delaunay.length; i++ ) { t = ( delaunay[ i ] as Triangle ); t.getCenter(); col_0 = bd.getPixel32( t.center.x, t.center.y ); canvas.graphics.beginFill( col_0, 1 ); canvas.graphics.moveTo(t.p1.x, t.p1.y); canvas.graphics.lineTo(t.p2.x, t.p2.y); canvas.graphics.lineTo(t.p3.x, t.p3.y); canvas.graphics.lineTo(t.p1.x, t.p1.y); canvas.graphics.endFill(); } break; case 'GRADIENT': for ( i = 0; i < delaunay.length; i++ ) { t = ( delaunay[ i ] as Triangle ); //leftMost - rightMost points to collect the color minP = ( t.p1.x < t.p2.x && t.p1.x < t.p3.x ) ? t.p1 : ( t.p2.x < t.p3.x ) ? t.p2 : t.p3; maxP = ( t.p1.x > t.p2.x && t.p1.x > t.p3.x ) ? t.p1 : ( t.p2.x > t.p3.x ) ? t.p2 : t.p3; col_0 = bd.getPixel32( minP.x, minP.y ); col_2 = bd.getPixel32( maxP.x, maxP.y ); //gets the color in the center of the triangle t.getCenter(); col_1 = bd.getPixel32( t.center.x, t.center.y ); //upMost / downMost points to set the gradient height miny = Math.min( t.p1.y , Math.min( t.p2.y, t.p3.y ) ); maxy = Math.max( t.p1.y , Math.max( t.p2.y, t.p3.y ) ); //creates the gradient box m.identity(); m.createGradientBox( maxP.x - minP.x, maxy - miny, 0, minP.x, minP.y ) canvas.graphics.beginGradientFill( type, [col_0, col_1, col_2], [ 1,1,1 ], [ 0, 127, 255 ], m, 'pad', 'rgb', 0 ); canvas.graphics.moveTo(t.p1.x, t.p1.y); canvas.graphics.lineTo(t.p2.x, t.p2.y); canvas.graphics.lineTo(t.p3.x, t.p3.y); canvas.graphics.lineTo(t.p1.x, t.p1.y); canvas.graphics.endFill(); } break; default: break; } } } } }