Tip: Custom Mask workaround

SUCCESS!!!

package;


import openfl.display.BitmapData;
import openfl.display.Bitmap;
import openfl.display.DisplayObject;
import openfl.display.DisplayObjectShader;
import openfl.display.Shader;
import openfl.display.Sprite;
import openfl.filters.ShaderFilter;

import openfl.filters.BlurFilter;


class Main extends Sprite {
	
	
	public function new () {
		
		super ();
		
		var mc_starspin_Bitmap = new Bitmap(Assets.getBitmapData("images/eg_starspin.png"));
		addChild(mc_starspin_Bitmap);

		mc_starspin_Bitmap.x = -75;
		mc_starspin_Bitmap.y = -90;

		var mask = new Sprite ();
		mask.graphics.beginFill (0xFFFFFF);
		mask.graphics.drawEllipse (150, 15, 150, 400);

		var filter = new BlurFilter(50, 50, 1);
		mask.filters = [filter];

		applyMask (mc_starspin_Bitmap, mask);
		
	}
	
	
	private function applyMask (bitmap:Bitmap, mask:DisplayObject):Void {
		
		#if flash
		
		bitmap.mask = mask;
		
		#else
		
		var bitmapDataMask = new BitmapData (bitmap.bitmapData.width, bitmap.bitmapData.height, true, 0x00FFFFFF);
		bitmapDataMask.draw (mask);
		
		var shader = new BitmapMaskShader ();
		shader.maskImage.input = bitmapDataMask;

		bitmap.shader = shader;
		
		#end
		
	}
	
	
}


class BitmapMaskShader extends DisplayObjectShader {
	
	
	@:glFragmentSource("
		
		#pragma header
		
		uniform sampler2D maskImage;
		
		void main(void) {
			
			#pragma body
			
			float mask = texture2D (maskImage, openfl_TextureCoordv).a;
			gl_FragColor *= mask;
			
		}
		
	")
	
	public function new () {
		
		super ();
		
	}
	
	
}
1 Like