/src/away3d/materials/methods/EnvMapDiffuseMethod.as

http://github.com/away3d/away3d-core-fp11 · ActionScript · 131 lines · 76 code · 20 blank · 35 comment · 2 complexity · f1234a6d2eb976a5704371c1828e848e MD5 · raw file

  1. package away3d.materials.methods
  2. {
  3. import away3d.arcane;
  4. import away3d.core.managers.CubeTexture3DProxy;
  5. import away3d.core.managers.Stage3DProxy;
  6. import away3d.materials.utils.CubeMap;
  7. import away3d.materials.utils.ShaderRegisterCache;
  8. import away3d.materials.utils.ShaderRegisterElement;
  9. use namespace arcane;
  10. /**
  11. * EnvMapDiffuseMethod provides a diffuse shading method that uses a diffuse irradiance environment map to
  12. * approximate global lighting rather than lights.
  13. */
  14. public class EnvMapDiffuseMethod extends BasicDiffuseMethod
  15. {
  16. private var _cubeTexture : CubeTexture3DProxy;
  17. private var _cubeMapIndex : int;
  18. /**
  19. * Creates a new EnvMapDiffuseMethod object.
  20. * @param envMap The cube environment map to use for the diffuse lighting.
  21. */
  22. public function EnvMapDiffuseMethod(envMap : CubeMap)
  23. {
  24. _cubeTexture = new CubeTexture3DProxy();
  25. _cubeTexture.cubeMap = envMap;
  26. }
  27. arcane override function reset() : void
  28. {
  29. super.reset();
  30. _cubeMapIndex = -1;
  31. }
  32. /**
  33. * @inheritDoc
  34. */
  35. override public function dispose(deep : Boolean) : void
  36. {
  37. _cubeTexture.dispose(deep);
  38. }
  39. /**
  40. * The cube environment map to use for the diffuse lighting.
  41. */
  42. public function get envMap() : CubeMap
  43. {
  44. return _cubeTexture.cubeMap;
  45. }
  46. public function set envMap(value : CubeMap) : void
  47. {
  48. _cubeTexture.cubeMap = value;
  49. }
  50. /**
  51. * @inheritDoc
  52. */
  53. arcane override function set numLights(value : int) : void
  54. {
  55. super.numLights = value;
  56. _needsNormals = true;
  57. }
  58. /**
  59. * @inheritDoc
  60. */
  61. arcane override function activate(stage3DProxy : Stage3DProxy) : void
  62. {
  63. super.activate(stage3DProxy);
  64. stage3DProxy.setTextureAt(_cubeMapIndex, _cubeTexture.getTextureForContext(stage3DProxy));
  65. }
  66. // arcane override function deactivate(stage3DProxy : Stage3DProxy) : void
  67. // {
  68. // super.deactivate(stage3DProxy);
  69. //
  70. // stage3DProxy.setTextureAt(_cubeMapIndex, null);
  71. // }
  72. /**
  73. * @inheritDoc
  74. */
  75. arcane override function getFragmentAGALPreLightingCode(regCache : ShaderRegisterCache) : String
  76. {
  77. return "";
  78. }
  79. /**
  80. * @inheritDoc
  81. */
  82. arcane override function getFragmentCodePerLight(lightIndex : int, lightDirReg : ShaderRegisterElement, lightColReg : ShaderRegisterElement, regCache : ShaderRegisterCache) : String
  83. {
  84. return "";
  85. }
  86. /**
  87. * @inheritDoc
  88. */
  89. arcane override function getFragmentPostLightingCode(regCache : ShaderRegisterCache, targetReg : ShaderRegisterElement) : String
  90. {
  91. var code : String = "";
  92. var cubeMapReg : ShaderRegisterElement = regCache.getFreeTextureReg();
  93. var temp : ShaderRegisterElement = regCache.getFreeFragmentVectorTemp();
  94. code += "tex " + temp + ", " + _normalFragmentReg + ", " + cubeMapReg + " <cube,miplinear,linear,clamp>\n" +
  95. "add " + temp+".xyz, " + temp+".xyz, " + targetReg+".xyz\n" +
  96. "sat " + temp+".xyz, " + temp+".xyz\n";
  97. _cubeMapIndex = cubeMapReg.index;
  98. if (_useTexture) {
  99. _diffuseInputRegister = regCache.getFreeTextureReg();
  100. code += getTexSampleCode(targetReg, _diffuseInputRegister);
  101. }
  102. else {
  103. _diffuseInputRegister = regCache.getFreeFragmentConstant();
  104. code += "mov " + targetReg + ", " + _diffuseInputRegister + "\n";
  105. }
  106. _diffuseInputIndex = _diffuseInputRegister.index;
  107. code += "mul " + targetReg + ", " + targetReg + ", " + temp + " \n";
  108. return code;
  109. }
  110. }
  111. }