/src/away3d/materials/methods/HardShadowMapMethod.as

http://github.com/away3d/away3d-core-fp11 · ActionScript · 99 lines · 64 code · 15 blank · 20 comment · 0 complexity · 36e092db3bd2a53cbaa0a9733ca08936 MD5 · raw file

  1. package away3d.materials.methods
  2. {
  3. import away3d.arcane;
  4. import away3d.core.managers.Stage3DProxy;
  5. import away3d.lights.LightBase;
  6. import away3d.materials.compilation.ShaderRegisterCache;
  7. import away3d.materials.compilation.ShaderRegisterElement;
  8. use namespace arcane;
  9. /**
  10. * HardShadowMapMethod provides the cheapest shadow map method by using a single tap without any filtering.
  11. */
  12. public class HardShadowMapMethod extends SimpleShadowMapMethodBase
  13. {
  14. /**
  15. * Creates a new HardShadowMapMethod object.
  16. */
  17. public function HardShadowMapMethod(castingLight:LightBase)
  18. {
  19. super(castingLight);
  20. }
  21. /**
  22. * @inheritDoc
  23. */
  24. override protected function getPlanarFragmentCode(vo:MethodVO, regCache:ShaderRegisterCache, targetReg:ShaderRegisterElement):String
  25. {
  26. var depthMapRegister:ShaderRegisterElement = regCache.getFreeTextureReg();
  27. var decReg:ShaderRegisterElement = regCache.getFreeFragmentConstant();
  28. // needs to be reserved anyway. DO NOT REMOVE
  29. var dataReg:ShaderRegisterElement = regCache.getFreeFragmentConstant();
  30. // TODO not used
  31. dataReg = dataReg;
  32. var depthCol:ShaderRegisterElement = regCache.getFreeFragmentVectorTemp();
  33. var code:String = "";
  34. vo.fragmentConstantsIndex = decReg.index*4;
  35. vo.texturesIndex = depthMapRegister.index;
  36. code += "tex " + depthCol + ", " + _depthMapCoordReg + ", " + depthMapRegister + " <2d, nearest, clamp>\n" +
  37. "dp4 " + depthCol + ".z, " + depthCol + ", " + decReg + "\n" +
  38. "slt " + targetReg + ".w, " + _depthMapCoordReg + ".z, " + depthCol + ".z\n"; // 0 if in shadow
  39. return code;
  40. }
  41. /**
  42. * @inheritDoc
  43. */
  44. override protected function getPointFragmentCode(vo:MethodVO, regCache:ShaderRegisterCache, targetReg:ShaderRegisterElement):String
  45. {
  46. var depthMapRegister:ShaderRegisterElement = regCache.getFreeTextureReg();
  47. var decReg:ShaderRegisterElement = regCache.getFreeFragmentConstant();
  48. var epsReg:ShaderRegisterElement = regCache.getFreeFragmentConstant();
  49. var posReg:ShaderRegisterElement = regCache.getFreeFragmentConstant();
  50. var depthSampleCol:ShaderRegisterElement = regCache.getFreeFragmentVectorTemp();
  51. regCache.addFragmentTempUsages(depthSampleCol, 1);
  52. var lightDir:ShaderRegisterElement = regCache.getFreeFragmentVectorTemp();
  53. var code:String = "";
  54. vo.fragmentConstantsIndex = decReg.index*4;
  55. vo.texturesIndex = depthMapRegister.index;
  56. code += "sub " + lightDir + ", " + _sharedRegisters.globalPositionVarying + ", " + posReg + "\n" +
  57. "dp3 " + lightDir + ".w, " + lightDir + ".xyz, " + lightDir + ".xyz\n" +
  58. "mul " + lightDir + ".w, " + lightDir + ".w, " + posReg + ".w\n" +
  59. "nrm " + lightDir + ".xyz, " + lightDir + ".xyz\n" +
  60. "tex " + depthSampleCol + ", " + lightDir + ", " + depthMapRegister + " <cube, nearest, clamp>\n" +
  61. "dp4 " + depthSampleCol + ".z, " + depthSampleCol + ", " + decReg + "\n" +
  62. "add " + targetReg + ".w, " + lightDir + ".w, " + epsReg + ".x\n" + // offset by epsilon
  63. "slt " + targetReg + ".w, " + targetReg + ".w, " + depthSampleCol + ".z\n"; // 0 if in shadow
  64. regCache.removeFragmentTempUsage(depthSampleCol);
  65. return code;
  66. }
  67. /**
  68. * @inheritDoc
  69. */
  70. override arcane function getCascadeFragmentCode(vo:MethodVO, regCache:ShaderRegisterCache, decodeRegister:ShaderRegisterElement, depthTexture:ShaderRegisterElement, depthProjection:ShaderRegisterElement, targetRegister:ShaderRegisterElement):String
  71. {
  72. var temp:ShaderRegisterElement = regCache.getFreeFragmentVectorTemp();
  73. return "tex " + temp + ", " + depthProjection + ", " + depthTexture + " <2d, nearest, clamp>\n" +
  74. "dp4 " + temp + ".z, " + temp + ", " + decodeRegister + "\n" +
  75. "slt " + targetRegister + ".w, " + depthProjection + ".z, " + temp + ".z\n"; // 0 if in shadow
  76. }
  77. /**
  78. * @inheritDoc
  79. */
  80. override arcane function activateForCascade(vo:MethodVO, stage3DProxy:Stage3DProxy):void
  81. {
  82. }
  83. }
  84. }