/src/away3d/filters/tasks/Filter3DBlurTask.as

http://github.com/away3d/away3d-core-fp11 · ActionScript · 119 lines · 92 code · 26 blank · 1 comment · 15 complexity · 1f3aff15f5adef98d0f21605600a9a4d MD5 · raw file

  1. package away3d.filters.tasks
  2. {
  3. import away3d.cameras.Camera3D;
  4. import away3d.core.managers.Stage3DProxy;
  5. import flash.display3D.Context3DProgramType;
  6. import flash.display3D.textures.Texture;
  7. public class Filter3DBlurTask extends Filter3DTaskBase
  8. {
  9. private static const MAX_BLUR : int = 6;
  10. private var _blurX : uint;
  11. private var _blurY : uint;
  12. private var _data : Vector.<Number>;
  13. private var _stepX : Number = 1;
  14. private var _stepY : Number = 1;
  15. private var _numSamples : uint;
  16. public function Filter3DBlurTask(blurX : uint = 3, blurY : uint = 3)
  17. {
  18. super();
  19. _blurX = blurX;
  20. _blurY = blurY;
  21. _data = Vector.<Number>([0, 0, 0, 1, 0, 0, 0, 0]);
  22. }
  23. public function get blurX() : uint
  24. {
  25. return _blurX;
  26. }
  27. public function set blurX(value : uint) : void
  28. {
  29. _blurX = value;
  30. if (_blurX > MAX_BLUR) _stepX = _blurX/MAX_BLUR;
  31. else _stepX = 1;
  32. invalidateProgram3D();
  33. updateBlurData();
  34. }
  35. public function get blurY() : uint
  36. {
  37. return _blurY;
  38. }
  39. public function set blurY(value : uint) : void
  40. {
  41. _blurY = value;
  42. invalidateProgram3D();
  43. updateBlurData();
  44. }
  45. override protected function getFragmentCode() : String
  46. {
  47. var code : String;
  48. _numSamples = 0;
  49. code = "mov ft0, v0 \n" +
  50. "sub ft0.y, v0.y, fc0.y\n";
  51. for (var y : Number = 0; y <= _blurY; y += _stepY) {
  52. if (y > 0) code += "sub ft0.x, v0.x, fc0.x\n";
  53. for (var x : Number = 0; x <= _blurX; x += _stepX) {
  54. ++_numSamples;
  55. if (x == 0 && y == 0)
  56. code += "tex ft1, ft0, fs0 <2d,nearest,clamp>\n";
  57. else
  58. code += "tex ft2, ft0, fs0 <2d,nearest,clamp>\n" +
  59. "add ft1, ft1, ft2 \n";
  60. if (x < _blurX)
  61. code += "add ft0.x, ft0.x, fc1.x \n";
  62. }
  63. if (y < _blurY) code += "add ft0.y, ft0.y, fc1.y \n";
  64. }
  65. code += "mul oc, ft1, fc0.z";
  66. _data[2] = 1/_numSamples;
  67. return code;
  68. }
  69. override public function activate(stage3DProxy : Stage3DProxy, camera3D : Camera3D, depthTexture : Texture) : void
  70. {
  71. stage3DProxy.context3D.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT, 0, _data, 2);
  72. }
  73. override protected function updateTextures(stage : Stage3DProxy) : void
  74. {
  75. super.updateTextures(stage);
  76. updateBlurData();
  77. }
  78. private function updateBlurData() : void
  79. {
  80. // todo: must be normalized using view size ratio
  81. var invW : Number = 1/_textureWidth;
  82. var invH : Number = 1/_textureHeight;
  83. if (_blurX > MAX_BLUR) _stepX = _blurX/MAX_BLUR;
  84. else _stepX = 1;
  85. if (_blurY > MAX_BLUR) _stepY = _blurY/MAX_BLUR;
  86. else _stepY = 1;
  87. _data[0] = _blurX*.5*invW;
  88. _data[1] = _blurY*.5*invH;
  89. _data[4] = _stepX*invW;
  90. _data[5] = _stepY*invH;
  91. }
  92. }
  93. }