/src/away3d/filters/tasks/Filter3DRadialBlurTask.as

http://github.com/away3d/away3d-core-fp11 · ActionScript · 183 lines · 137 code · 27 blank · 19 comment · 1 complexity · 1e8c8db0685508b2309df1fd7f7227d7 MD5 · raw file

  1. package away3d.filters.tasks
  2. {
  3. import away3d.arcane;
  4. import away3d.cameras.Camera3D;
  5. import away3d.core.managers.Stage3DProxy;
  6. import flash.display3D.Context3D;
  7. import flash.display3D.Context3DProgramType;
  8. import flash.display3D.textures.Texture;
  9. use namespace arcane;
  10. public class Filter3DRadialBlurTask extends Filter3DTaskBase
  11. {
  12. private static const LAYERS:int = 15;
  13. private var _data:Vector.<Number>;
  14. private var _intensity:Number = 1.0;
  15. private var _glowGamma:Number = 1.0;
  16. private var _blurStart:Number = 1.0;
  17. private var _blurWidth:Number = -0.3;
  18. private var _cx:Number = 0.5;
  19. private var _cy:Number = 0.5;
  20. public function Filter3DRadialBlurTask(intensity:Number = 1.0, glowGamma:Number = 1.0, blurStart:Number = 1.0, blurWidth:Number = -0.3, cx:Number = 0.5, cy:Number = 0.5)
  21. {
  22. super();
  23. _intensity = intensity;
  24. _glowGamma = glowGamma;
  25. _blurStart = blurStart;
  26. _blurWidth = blurWidth;
  27. _cx = cx;
  28. _cy = cy;
  29. _data = Vector.<Number>([0, 0, 0, 0, 0, 0, 0, 0, 0, 1, LAYERS, LAYERS - 1]);
  30. resetUniforms();
  31. }
  32. private function resetUniforms():void
  33. {
  34. _data[0] = _intensity;
  35. _data[1] = _glowGamma;
  36. _data[2] = _blurStart;
  37. _data[3] = _blurWidth;
  38. _data[4] = _cx;
  39. _data[5] = _cy;
  40. }
  41. override protected function getVertexCode():String
  42. {
  43. return "mov op, va0\n" +
  44. "mov vt0, vc2.xxxy\n" +
  45. "sub vt0.xy, va1.xy, vc1.xy \n" +
  46. "mov v0, vt0";
  47. }
  48. override protected function getFragmentCode():String
  49. {
  50. var code:String;
  51. code =
  52. //half4 blurred = 0,0,0,0; = ft1
  53. "mov ft1, fc2.xxxx \n" +
  54. // float2 ctrPt = float2(CX,CY); -> ft2
  55. "mov ft2.xy, fc1.xy \n" +
  56. // ft3.x -> counter = 0;
  57. "mov ft3.x, fc2.x \n";
  58. // Y-Axis
  59. for (var i:int = 0; i <= LAYERS; i++) {
  60. // float scale = BlurStart + BlurWidth*(i/(float) (nsamples-1)); -> ft4
  61. // ft4.x = (i/(float) (nsamples-1))
  62. code += "div ft4.x, ft3.x, fc2.w\n";
  63. // ft4.x *= Blurwidth;
  64. code += "mul ft4.x, ft4.x, fc0.w \n";
  65. // ft4.x += BlurStart;
  66. code += "add ft4.x, ft4.x, fc0.z \n";
  67. // blurred += tex2D(tex, IN.UV.xy*scale + ctrPt );
  68. code += "mov ft5.xy ,v0.xy\n";
  69. code += "mul ft5.xy, ft5.xy, ft4.xx \n";
  70. code += "add ft5.xy, ft5.xy, fc1.xy \n";
  71. code += "tex ft5, ft5.xy, fs0<2d, clamp, linear>\n";
  72. code += "add ft1, ft1, ft5 \n";
  73. // inc counter by one
  74. code += "add ft3.x, ft3.x, fc2.y \n";
  75. }
  76. /* blurred /= nsamples;
  77. blurred.rgb = pow(blurred.rgb,GlowGamma);
  78. blurred.rgb *= Intensity;
  79. blurred.rgb = saturate(blurred.rgb);
  80. */
  81. code += "div ft1, ft1, fc2.z\n";
  82. code += "pow ft1.xyz, ft1.xyz, fc0.y\n";
  83. code += "mul ft1.xyz, ft1.xyz, fc0.x\n";
  84. code += "sat ft1.xyz, ft1.xyz \n";
  85. // var origTex = tex2D(tex, IN.UV.xy + ctrPt );
  86. code += "add ft0.xy, v0.xy, fc1.xy \n";
  87. code += "tex ft6, ft0.xy, fs0<2d,clamp, linear>\n";
  88. // var newC = origTex.rgb + blurred.rgb;
  89. code += "add ft1.xyz, ft1.xyz, ft6.xyz \n";
  90. // return newC
  91. code += "mov oc, ft1\n";
  92. //trace(code);
  93. return code;
  94. }
  95. public function get intensity():Number
  96. {
  97. return _intensity;
  98. }
  99. public function set intensity(intensity:Number):void
  100. {
  101. _intensity = intensity;
  102. resetUniforms();
  103. }
  104. public function get glowGamma():Number
  105. {
  106. return _glowGamma;
  107. }
  108. public function set glowGamma(glowGamma:Number):void
  109. {
  110. _glowGamma = glowGamma;
  111. resetUniforms();
  112. }
  113. public function get blurStart():Number
  114. {
  115. return _blurStart;
  116. }
  117. public function set blurStart(blurStart:Number):void
  118. {
  119. _blurStart = blurStart;
  120. resetUniforms();
  121. }
  122. public function get blurWidth():Number
  123. {
  124. return _blurWidth;
  125. }
  126. public function set blurWidth(blurWidth:Number):void
  127. {
  128. _blurWidth = blurWidth;
  129. resetUniforms();
  130. }
  131. public function get cx():Number
  132. {
  133. return _cx;
  134. }
  135. public function set cx(cx:Number):void
  136. {
  137. _cx = cx;
  138. resetUniforms();
  139. }
  140. public function get cy():Number
  141. {
  142. return _cy;
  143. }
  144. public function set cy(cy:Number):void
  145. {
  146. _cy = cy;
  147. resetUniforms();
  148. }
  149. override public function activate(stage3DProxy:Stage3DProxy, camera3D:Camera3D, depthTexture:Texture):void
  150. {
  151. var context:Context3D = stage3DProxy._context3D;
  152. context.setProgramConstantsFromVector(Context3DProgramType.VERTEX, 0, _data, 3);
  153. context.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT, 0, _data, 3);
  154. }
  155. }
  156. }