package; import openfl.display.Shader; import openfl.utils.ByteArray; /** * ... * @author */ class MandelbrotShader extends Shader { @:glVertexHeader( "attribute float openfl_Alpha; attribute vec4 openfl_ColorMultiplier; attribute vec4 openfl_ColorOffset; attribute vec4 openfl_Position; attribute vec2 openfl_TextureCoord; varying float openfl_Alphav; varying vec4 openfl_ColorMultiplierv; varying vec4 openfl_ColorOffsetv; varying vec2 openfl_TextureCoordv; uniform mat4 openfl_Matrix; uniform bool openfl_HasColorTransform; uniform vec2 openfl_TextureSize;" ) @:glVertexBody( "openfl_Alphav = openfl_Alpha; openfl_TextureCoordv = openfl_TextureCoord; if (openfl_HasColorTransform) { openfl_ColorMultiplierv = openfl_ColorMultiplier; openfl_ColorOffsetv = openfl_ColorOffset / 255.0; } gl_Position = openfl_Matrix * openfl_Position;" ) @:glVertexSource( "#pragma header void main(void) { #pragma body }" ) @:glFragmentHeader( "varying float openfl_Alphav; varying vec4 openfl_ColorMultiplierv; varying vec4 openfl_ColorOffsetv; varying vec2 openfl_TextureCoordv; uniform bool openfl_HasColorTransform; uniform vec2 openfl_TextureSize; uniform sampler2D bitmap; uniform float time;" ) @:glFragmentBody( "vec4 color = texture2D (bitmap, openfl_TextureCoordv); if (color.a == 0.0) { gl_FragColor = vec4 (0.0, 0.0, 0.0, 0.0); } else if (openfl_HasColorTransform) { color = vec4 (color.rgb / color.a, color.a); mat4 colorMultiplier = mat4 (0); colorMultiplier[0][0] = openfl_ColorMultiplierv.x; colorMultiplier[1][1] = openfl_ColorMultiplierv.y; colorMultiplier[2][2] = openfl_ColorMultiplierv.z; colorMultiplier[3][3] = 1.0; // openfl_ColorMultiplierv.w; color = clamp (openfl_ColorOffsetv + (color * colorMultiplier), 0.0, 1.0); if (color.a > 0.0) { gl_FragColor = vec4 (color.rgb * color.a * openfl_Alphav, color.a * openfl_Alphav); } else { gl_FragColor = vec4 (0.0, 0.0, 0.0, 0.0); } } else { gl_FragColor = color * openfl_Alphav; }" ) // mandelbrot shader from http://glslsandbox.com/e#52266.0 @:glFragmentSource( "#pragma header vec3 mandelbrot(vec2 p) { vec2 s = p; float d = 0.0, l; for (int i = 0; i < 2000; i++) { s = vec2(s.x * s.x - s.y * s.y + p.x, 2.0 * s.x * s.y + p.y); l = length(s); d += l + 0.2; if (l > 2.0) return vec3(sin(d * 0.0314), sin(d * 0.02), sin(d * 0.1)); } return vec3(0.0); } void main(void) { #pragma body vec2 p = (openfl_TextureCoordv * 4.0 - 2.0) * .1; float f = sin(time * 0.05 + 99.0) * 0.5 + 0.5; p *= pow(1.5, f * (-31.0)); p += vec2(-1.002029, 0.303864); gl_FragColor = vec4(mandelbrot(p), openfl_Alphav); " + #if emscripten "gl_FragColor = gl_FragColor.bgra;}" #else "}" #end ) public function new(code:ByteArray=null) { super(code); } }