/src/away3d/materials/methods/FogMethod.as

http://github.com/away3d/away3d-core-fp11 · ActionScript · 137 lines · 91 code · 16 blank · 30 comment · 0 complexity · 567b76ce68a26979c23202e3afa473b4 MD5 · raw file

  1. package away3d.materials.methods
  2. {
  3. import away3d.arcane;
  4. import away3d.core.managers.Stage3DProxy;
  5. import away3d.materials.compilation.ShaderRegisterCache;
  6. import away3d.materials.compilation.ShaderRegisterElement;
  7. use namespace arcane;
  8. /**
  9. * FogMethod provides a method to add distance-based fog to a material.
  10. */
  11. public class FogMethod extends EffectMethodBase
  12. {
  13. private var _minDistance:Number = 0;
  14. private var _maxDistance:Number = 1000;
  15. private var _fogColor:uint;
  16. private var _fogR:Number;
  17. private var _fogG:Number;
  18. private var _fogB:Number;
  19. /**
  20. * Creates a new FogMethod object.
  21. * @param minDistance The distance from which the fog starts appearing.
  22. * @param maxDistance The distance at which the fog is densest.
  23. * @param fogColor The colour of the fog.
  24. */
  25. public function FogMethod(minDistance:Number, maxDistance:Number, fogColor:uint = 0x808080)
  26. {
  27. super();
  28. this.minDistance = minDistance;
  29. this.maxDistance = maxDistance;
  30. this.fogColor = fogColor;
  31. }
  32. /**
  33. * @inheritDoc
  34. */
  35. override arcane function initVO(vo:MethodVO):void
  36. {
  37. vo.needsProjection = true;
  38. }
  39. /**
  40. * @inheritDoc
  41. */
  42. override arcane function initConstants(vo:MethodVO):void
  43. {
  44. var data:Vector.<Number> = vo.fragmentData;
  45. var index:int = vo.fragmentConstantsIndex;
  46. data[index + 3] = 1;
  47. data[index + 6] = 0;
  48. data[index + 7] = 0;
  49. }
  50. /**
  51. * The distance from which the fog starts appearing.
  52. */
  53. public function get minDistance():Number
  54. {
  55. return _minDistance;
  56. }
  57. public function set minDistance(value:Number):void
  58. {
  59. _minDistance = value;
  60. }
  61. /**
  62. * The distance at which the fog is densest.
  63. */
  64. public function get maxDistance():Number
  65. {
  66. return _maxDistance;
  67. }
  68. public function set maxDistance(value:Number):void
  69. {
  70. _maxDistance = value;
  71. }
  72. /**
  73. * The colour of the fog.
  74. */
  75. public function get fogColor():uint
  76. {
  77. return _fogColor;
  78. }
  79. public function set fogColor(value:uint):void
  80. {
  81. _fogColor = value;
  82. _fogR = ((value >> 16) & 0xff)/0xff;
  83. _fogG = ((value >> 8) & 0xff)/0xff;
  84. _fogB = (value & 0xff)/0xff;
  85. }
  86. /**
  87. * @inheritDoc
  88. */
  89. arcane override function activate(vo:MethodVO, stage3DProxy:Stage3DProxy):void
  90. {
  91. var data:Vector.<Number> = vo.fragmentData;
  92. var index:int = vo.fragmentConstantsIndex;
  93. data[index] = _fogR;
  94. data[index + 1] = _fogG;
  95. data[index + 2] = _fogB;
  96. data[index + 4] = _minDistance;
  97. data[index + 5] = 1/(_maxDistance - _minDistance);
  98. }
  99. /**
  100. * @inheritDoc
  101. */
  102. arcane override function getFragmentCode(vo:MethodVO, regCache:ShaderRegisterCache, targetReg:ShaderRegisterElement):String
  103. {
  104. var fogColor:ShaderRegisterElement = regCache.getFreeFragmentConstant();
  105. var fogData:ShaderRegisterElement = regCache.getFreeFragmentConstant();
  106. var temp:ShaderRegisterElement = regCache.getFreeFragmentVectorTemp();
  107. regCache.addFragmentTempUsages(temp, 1);
  108. var temp2:ShaderRegisterElement = regCache.getFreeFragmentVectorTemp();
  109. var code:String = "";
  110. vo.fragmentConstantsIndex = fogColor.index*4;
  111. code += "sub " + temp2 + ".w, " + _sharedRegisters.projectionFragment + ".z, " + fogData + ".x \n" +
  112. "mul " + temp2 + ".w, " + temp2 + ".w, " + fogData + ".y \n" +
  113. "sat " + temp2 + ".w, " + temp2 + ".w \n" +
  114. "sub " + temp + ", " + fogColor + ", " + targetReg + "\n" + // (fogColor- col)
  115. "mul " + temp + ", " + temp + ", " + temp2 + ".w \n" + // (fogColor- col)*fogRatio
  116. "add " + targetReg + ", " + targetReg + ", " + temp + "\n"; // fogRatio*(fogColor- col) + col
  117. regCache.removeFragmentTempUsage(temp);
  118. return code;
  119. }
  120. }
  121. }