InnerGlow.hx 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package h2d.filter;
  2. private class GlowShader extends h3d.shader.ScreenShader {
  3. static var SRC = {
  4. @param var texture : Sampler2D;
  5. @param var color : Vec3;
  6. function fragment() {
  7. var a = texture.get(input.uv).a;
  8. output.color = vec4(color, 1-a);
  9. }
  10. };
  11. }
  12. private class GlowBlendShader extends h3d.shader.ScreenShader {
  13. static var SRC = {
  14. @param var srcTex : Sampler2D;
  15. @param var glowTex : Sampler2D;
  16. @param var alpha : Float;
  17. function fragment() {
  18. var src = srcTex.get(input.uv);
  19. var glow = glowTex.get(input.uv);
  20. var color = mix(src, glow, alpha);
  21. output.color = vec4(color.rgb * src.a, src.a);
  22. }
  23. };
  24. }
  25. /**
  26. Adds a glow backdrop to the filtered Object.
  27. **/
  28. class InnerGlow extends Blur {
  29. public var color : Int;
  30. public var alpha : Float;
  31. public var blendMode : BlendMode = Alpha;
  32. /**
  33. Create new Glow filter.
  34. @param color The color of the glow.
  35. @param alpha Transparency value of the glow.
  36. @param radius The glow distance in pixels.
  37. @param gain The glow color intensity.
  38. @param quality The sample count on each pixel as a tradeoff of speed/quality.
  39. **/
  40. var glowPass = new h3d.pass.ScreenFx<GlowShader>(new GlowShader());
  41. var blendPass = new h3d.pass.ScreenFx<GlowBlendShader>(new GlowBlendShader());
  42. public function new( color : Int = 0xFFFFFF, alpha = 1., radius = 1., gain = 1., quality = 1. ) {
  43. super(radius, gain, quality);
  44. this.color = color;
  45. this.alpha = alpha;
  46. }
  47. override function draw( ctx : RenderContext, t : h2d.Tile ) {
  48. var tex = t.getTexture();
  49. var glowMaskTex = ctx.textures.allocTileTarget("innerGlowMask", t);
  50. glowPass.shader.color.setColor(color);
  51. glowPass.shader.texture = tex;
  52. ctx.engine.pushTarget(glowMaskTex);
  53. glowPass.render();
  54. ctx.engine.popTarget();
  55. pass.apply(ctx, glowMaskTex);
  56. var blended = ctx.textures.allocTileTarget("innerGlowBlended", t);
  57. h3d.pass.Copy.run(tex, blended, None);
  58. h3d.pass.Copy.run(glowMaskTex, blended, blendMode);
  59. blendPass.shader.alpha = alpha;
  60. blendPass.shader.srcTex = tex;
  61. blendPass.shader.glowTex = blended;
  62. ctx.engine.pushTarget(tex);
  63. blendPass.render();
  64. ctx.engine.popTarget();
  65. return t;
  66. }
  67. }