/src/away3d/materials/methods/TripleFilteredShadowMapMethod.as

http://github.com/away3d/away3d-core-fp11 · ActionScript · 194 lines · 146 code · 36 blank · 12 comment · 1 complexity · 414565af80f14e1e1c22fdc3420bc425 MD5 · raw file

  1. package away3d.materials.methods
  2. {
  3. import away3d.arcane;
  4. import away3d.lights.DirectionalLight;
  5. import away3d.lights.PointLight;
  6. import away3d.materials.compilation.ShaderRegisterCache;
  7. import away3d.materials.compilation.ShaderRegisterElement;
  8. use namespace arcane;
  9. [Deprecated(message="Please consider any of the superior shadow map methods: SoftShadowMapMethod or DitheredShadowMapMethod")]
  10. public class TripleFilteredShadowMapMethod extends SimpleShadowMapMethodBase
  11. {
  12. /**
  13. * Creates a new BasicDiffuseMethod object.
  14. *
  15. * @param castingLight The light casting the shadow
  16. */
  17. public function TripleFilteredShadowMapMethod(castingLight:DirectionalLight)
  18. {
  19. super(castingLight);
  20. if (castingLight is PointLight)
  21. throw new Error("FilteredShadowMapMethod not supported for Point Lights");
  22. }
  23. override arcane function initConstants(vo:MethodVO):void
  24. {
  25. super.initConstants(vo);
  26. var fragmentData:Vector.<Number> = vo.fragmentData;
  27. var index:int = vo.fragmentConstantsIndex;
  28. fragmentData[index + 8] = 1/3;
  29. fragmentData[index + 9] = castingLight.shadowMapper.depthMapSize;
  30. fragmentData[index + 10] = 1/castingLight.shadowMapper.depthMapSize;
  31. }
  32. /**
  33. * @inheritDoc
  34. */
  35. override protected function getPlanarFragmentCode(vo:MethodVO, regCache:ShaderRegisterCache, targetReg:ShaderRegisterElement):String
  36. {
  37. var depthMapRegister:ShaderRegisterElement = regCache.getFreeTextureReg();
  38. var decReg:ShaderRegisterElement = regCache.getFreeFragmentConstant();
  39. var dataReg:ShaderRegisterElement = regCache.getFreeFragmentConstant();
  40. var customDataReg:ShaderRegisterElement = regCache.getFreeFragmentConstant();
  41. var depthCol:ShaderRegisterElement = regCache.getFreeFragmentVectorTemp();
  42. var uvReg:ShaderRegisterElement;
  43. var code:String;
  44. vo.fragmentConstantsIndex = decReg.index*4;
  45. regCache.addFragmentTempUsages(depthCol, 1);
  46. uvReg = regCache.getFreeFragmentVectorTemp();
  47. regCache.addFragmentTempUsages(uvReg, 1);
  48. var viewDirReg:ShaderRegisterElement = _sharedRegisters.viewDirFragment;
  49. code = "mov " + uvReg + ", " + _depthMapCoordReg + "\n" +
  50. "tex " + depthCol + ", " + uvReg + ", " + depthMapRegister + " <2d, nearest, clamp>\n" +
  51. "dp4 " + depthCol + ".z, " + depthCol + ", " + decReg + "\n" +
  52. "slt " + uvReg + ".z, " + _depthMapCoordReg + ".z, " + depthCol + ".z \n" + // 0 if in shadow
  53. "add " + uvReg + ".x, " + uvReg + ".x, " + customDataReg + ".z \n" + // (1, 0)
  54. "tex " + depthCol + ", " + uvReg + ", " + depthMapRegister + " <2d, nearest, clamp>\n" +
  55. "dp4 " + depthCol + ".z, " + depthCol + ", " + decReg + "\n" +
  56. "slt " + uvReg + ".w, " + _depthMapCoordReg + ".z, " + depthCol + ".z \n" + // 0 if in shadow
  57. "div " + depthCol + ".x, " + _depthMapCoordReg + ".x, " + customDataReg + ".z \n" +
  58. "frc " + depthCol + ".x, " + depthCol + ".x \n" +
  59. "sub " + uvReg + ".w, " + uvReg + ".w, " + uvReg + ".z \n" +
  60. "mul " + uvReg + ".w, " + uvReg + ".w, " + depthCol + ".x \n" +
  61. "add " + viewDirReg + ".w, " + uvReg + ".z, " + uvReg + ".w \n" +
  62. "sub " + uvReg + ".x, " + _depthMapCoordReg + ".x, " + customDataReg + ".z \n" +
  63. "add " + uvReg + ".y, " + _depthMapCoordReg + ".y, " + customDataReg + ".z \n" + // (0, 1)
  64. "tex " + depthCol + ", " + uvReg + ", " + depthMapRegister + " <2d, nearest, clamp>\n" +
  65. "dp4 " + depthCol + ".z, " + depthCol + ", " + decReg + "\n" +
  66. "slt " + uvReg + ".z, " + _depthMapCoordReg + ".z, " + depthCol + ".z \n" + // 0 if in shadow
  67. "add " + uvReg + ".x, " + uvReg + ".x, " + customDataReg + ".z \n" + // (1, 1)
  68. "tex " + depthCol + ", " + uvReg + ", " + depthMapRegister + " <2d, nearest, clamp>\n" +
  69. "dp4 " + depthCol + ".z, " + depthCol + ", " + decReg + "\n" +
  70. "slt " + uvReg + ".w, " + _depthMapCoordReg + ".z, " + depthCol + ".z \n" + // 0 if in shadow
  71. // recalculate fraction, since we ran out of registers :(
  72. "mul " + depthCol + ".x, " + _depthMapCoordReg + ".x, " + customDataReg + ".y \n" +
  73. "frc " + depthCol + ".x, " + depthCol + ".x \n" +
  74. "sub " + uvReg + ".w, " + uvReg + ".w, " + uvReg + ".z \n" +
  75. "mul " + uvReg + ".w, " + uvReg + ".w, " + depthCol + ".x \n" +
  76. "add " + uvReg + ".w, " + uvReg + ".z, " + uvReg + ".w \n" +
  77. "mul " + depthCol + ".x, " + _depthMapCoordReg + ".y, " + customDataReg + ".y \n" +
  78. "frc " + depthCol + ".x, " + depthCol + ".x \n" +
  79. "sub " + uvReg + ".w, " + uvReg + ".w, " + viewDirReg + ".w \n" +
  80. "mul " + uvReg + ".w, " + uvReg + ".w, " + depthCol + ".x \n" +
  81. "add " + targetReg + ".w, " + viewDirReg + ".w, " + uvReg + ".w \n" +
  82. "sub " + uvReg + ".xy, " + _depthMapCoordReg + ".xy, " + customDataReg + ".zz \n" +
  83. "tex " + depthCol + ", " + uvReg + ", " + depthMapRegister + " <2d, nearest, clamp>\n" +
  84. "dp4 " + depthCol + ".z, " + depthCol + ", " + decReg + "\n" +
  85. "slt " + uvReg + ".z, " + _depthMapCoordReg + ".z, " + depthCol + ".z \n" + // 0 if in shadow
  86. "add " + uvReg + ".x, " + uvReg + ".x, " + customDataReg + ".z \n" + // (1, 0)
  87. "tex " + depthCol + ", " + uvReg + ", " + depthMapRegister + " <2d, nearest, clamp>\n" +
  88. "dp4 " + depthCol + ".z, " + depthCol + ", " + decReg + "\n" +
  89. "slt " + uvReg + ".w, " + _depthMapCoordReg + ".z, " + depthCol + ".z \n" + // 0 if in shadow
  90. "div " + depthCol + ".x, " + _depthMapCoordReg + ".x, " + customDataReg + ".z \n" +
  91. "frc " + depthCol + ".x, " + depthCol + ".x \n" +
  92. "sub " + uvReg + ".w, " + uvReg + ".w, " + uvReg + ".z \n" +
  93. "mul " + uvReg + ".w, " + uvReg + ".w, " + depthCol + ".x \n" +
  94. "add " + viewDirReg + ".w, " + uvReg + ".z, " + uvReg + ".w \n" +
  95. "mov " + uvReg + ".x, " + _depthMapCoordReg + ".x \n" +
  96. "add " + uvReg + ".y, " + uvReg + ".y, " + customDataReg + ".z \n" + // (0, 1)
  97. "tex " + depthCol + ", " + uvReg + ", " + depthMapRegister + " <2d, nearest, clamp>\n" +
  98. "dp4 " + depthCol + ".z, " + depthCol + ", " + decReg + "\n" +
  99. "sub " + depthCol + ".z, " + depthCol + ".z, " + dataReg + ".x \n" + // offset by epsilon
  100. "slt " + uvReg + ".z, " + _depthMapCoordReg + ".z, " + depthCol + ".z \n" + // 0 if in shadow
  101. "add " + uvReg + ".x, " + uvReg + ".x, " + customDataReg + ".z \n" + // (1, 1)
  102. "tex " + depthCol + ", " + uvReg + ", " + depthMapRegister + " <2d, nearest, clamp>\n" +
  103. "dp4 " + depthCol + ".z, " + depthCol + ", " + decReg + "\n" +
  104. "slt " + uvReg + ".w, " + _depthMapCoordReg + ".z, " + depthCol + ".z \n" + // 0 if in shadow
  105. // recalculate fraction, since we ran out of registers :(
  106. "mul " + depthCol + ".x, " + _depthMapCoordReg + ".x, " + customDataReg + ".y \n" +
  107. "frc " + depthCol + ".x, " + depthCol + ".x \n" +
  108. "sub " + uvReg + ".w, " + uvReg + ".w, " + uvReg + ".z \n" +
  109. "mul " + uvReg + ".w, " + uvReg + ".w, " + depthCol + ".x \n" +
  110. "add " + uvReg + ".w, " + uvReg + ".z, " + uvReg + ".w \n" +
  111. "mul " + depthCol + ".x, " + _depthMapCoordReg + ".y, " + customDataReg + ".y \n" +
  112. "frc " + depthCol + ".x, " + depthCol + ".x \n" +
  113. "sub " + uvReg + ".w, " + uvReg + ".w, " + viewDirReg + ".w \n" +
  114. "mul " + uvReg + ".w, " + uvReg + ".w, " + depthCol + ".x \n" +
  115. "add " + viewDirReg + ".w, " + viewDirReg + ".w, " + uvReg + ".w \n" +
  116. "add " + targetReg + ".w, " + targetReg + ".w, " + viewDirReg + ".w \n";
  117. code += "add " + uvReg + ".xy, " + _depthMapCoordReg + ".xy, " + customDataReg + ".zz \n" + // (1, 0)
  118. // "mov " + uvReg + ".y, " + _depthMapVar + ".y \n" + // (1, 0)
  119. "tex " + depthCol + ", " + uvReg + ", " + depthMapRegister + " <2d, nearest, clamp>\n" +
  120. "dp4 " + depthCol + ".z, " + depthCol + ", " + decReg + "\n" +
  121. "slt " + uvReg + ".z, " + _depthMapCoordReg + ".z, " + depthCol + ".z \n" + // 0 if in shadow
  122. "add " + uvReg + ".x, " + uvReg + ".x, " + customDataReg + ".z \n" + // (2, 0)
  123. "tex " + depthCol + ", " + uvReg + ", " + depthMapRegister + " <2d, nearest, clamp>\n" +
  124. "dp4 " + depthCol + ".z, " + depthCol + ", " + decReg + "\n" +
  125. "slt " + uvReg + ".w, " + _depthMapCoordReg + ".z, " + depthCol + ".z \n" + // 0 if in shadow
  126. "div " + depthCol + ".x, " + _depthMapCoordReg + ".x, " + customDataReg + ".z \n" +
  127. "frc " + depthCol + ".x, " + depthCol + ".x \n" +
  128. "sub " + uvReg + ".w, " + uvReg + ".w, " + uvReg + ".z \n" +
  129. "mul " + uvReg + ".w, " + uvReg + ".w, " + depthCol + ".x \n" +
  130. "add " + viewDirReg + ".w, " + uvReg + ".z, " + uvReg + ".w \n" +
  131. "add " + uvReg + ".xy, " + _depthMapCoordReg + ".xy, " + customDataReg + ".zz \n" + // (0, 1)
  132. "tex " + depthCol + ", " + uvReg + ", " + depthMapRegister + " <2d, nearest, clamp>\n" +
  133. "dp4 " + depthCol + ".z, " + depthCol + ", " + decReg + "\n" +
  134. "slt " + uvReg + ".z, " + _depthMapCoordReg + ".z, " + depthCol + ".z \n" + // 0 if in shadow
  135. "add " + uvReg + ".x, " + uvReg + ".x, " + customDataReg + ".z \n" + // (1, 1)
  136. "tex " + depthCol + ", " + uvReg + ", " + depthMapRegister + " <2d, nearest, clamp>\n" +
  137. "dp4 " + depthCol + ".z, " + depthCol + ", " + decReg + "\n" +
  138. "slt " + uvReg + ".w, " + _depthMapCoordReg + ".z, " + depthCol + ".z \n" + // 0 if in shadow
  139. // recalculate fraction, since we ran out of registers :(
  140. "mul " + depthCol + ".x, " + _depthMapCoordReg + ".x, " + customDataReg + ".y \n" +
  141. "frc " + depthCol + ".x, " + depthCol + ".x \n" +
  142. "sub " + uvReg + ".w, " + uvReg + ".w, " + uvReg + ".z \n" +
  143. "mul " + uvReg + ".w, " + uvReg + ".w, " + depthCol + ".x \n" +
  144. "add " + uvReg + ".w, " + uvReg + ".z, " + uvReg + ".w \n" +
  145. "mul " + depthCol + ".x, " + _depthMapCoordReg + ".y, " + customDataReg + ".y \n" +
  146. "frc " + depthCol + ".x, " + depthCol + ".x \n" +
  147. "sub " + uvReg + ".w, " + uvReg + ".w, " + viewDirReg + ".w \n" +
  148. "mul " + uvReg + ".w, " + uvReg + ".w, " + depthCol + ".x \n" +
  149. "add " + viewDirReg + ".w, " + viewDirReg + ".w, " + uvReg + ".w \n" +
  150. "add " + targetReg + ".w, " + targetReg + ".w, " + viewDirReg + ".w \n" +
  151. "mul " + targetReg + ".w, " + targetReg + ".w, " + customDataReg + ".x \n";
  152. regCache.removeFragmentTempUsage(depthCol);
  153. regCache.removeFragmentTempUsage(uvReg);
  154. vo.texturesIndex = depthMapRegister.index;
  155. return code;
  156. }
  157. }
  158. }