/src/away3d/core/managers/CubeTexture3DProxy.as

http://github.com/away3d/away3d-core-fp11 · ActionScript · 118 lines · 94 code · 21 blank · 3 comment · 18 complexity · e0b0db4ad4c428e12ea30e7e06f14907 MD5 · raw file

  1. /**
  2. * Author: David Lenaerts
  3. */
  4. package away3d.core.managers
  5. {
  6. import away3d.arcane;
  7. import away3d.events.Stage3DEvent;
  8. import away3d.materials.utils.CubeMap;
  9. import flash.display3D.Context3D;
  10. import flash.display3D.Context3DTextureFormat;
  11. import flash.display3D.textures.CubeTexture;
  12. use namespace arcane;
  13. public class CubeTexture3DProxy
  14. {
  15. private var _cubeMap : CubeMap;
  16. private var _textures : Vector.<CubeTexture>;
  17. private var _dirty : Vector.<Boolean>;
  18. private var _maxIndex : int = -1;
  19. private var _listensForDispose : Vector.<Boolean>;
  20. public function CubeTexture3DProxy()
  21. {
  22. _textures = new Vector.<CubeTexture>(8);
  23. _dirty = new Vector.<Boolean>(8);
  24. _listensForDispose = new Vector.<Boolean>(8);
  25. }
  26. public function get cubeMap() : CubeMap
  27. {
  28. return _cubeMap;
  29. }
  30. public function set cubeMap(value : CubeMap) : void
  31. {
  32. if (value == _cubeMap) return;
  33. if (_cubeMap) {
  34. if (value.size != _cubeMap.size)
  35. invalidateSize();
  36. else
  37. invalidateContent();
  38. }
  39. _cubeMap = value;
  40. }
  41. public function invalidateContent() : void
  42. {
  43. for (var i : int = 0; i <= _maxIndex; ++i) {
  44. _dirty[i] = true;
  45. }
  46. }
  47. private function invalidateSize() : void
  48. {
  49. var tex : CubeTexture;
  50. for (var i : int = 0; i <= _maxIndex; ++i) {
  51. tex = _textures[i];
  52. if (tex) {
  53. tex.dispose();
  54. _textures[i] = null;
  55. _dirty[i] = false;
  56. }
  57. }
  58. }
  59. public function dispose(deep : Boolean) : void
  60. {
  61. if (deep) {
  62. if (_cubeMap) _cubeMap.dispose();
  63. _cubeMap = null;
  64. }
  65. for (var i : int = 0; i <= _maxIndex; ++i)
  66. if (_textures[i]) _textures[i].dispose();
  67. }
  68. public function getTextureForContext(stage3DProxy : Stage3DProxy) : CubeTexture
  69. {
  70. var contextIndex : int = stage3DProxy._stage3DIndex;
  71. var context : Context3D = stage3DProxy._context3D;
  72. if (contextIndex > _maxIndex) _maxIndex = contextIndex;
  73. var tex : CubeTexture = _textures[contextIndex];
  74. if (!_listensForDispose[contextIndex]) {
  75. stage3DProxy.addEventListener(Stage3DEvent.CONTEXT3D_DISPOSED, onContext3DDisposed);
  76. _listensForDispose[contextIndex] = true;
  77. }
  78. if (!tex || _dirty[contextIndex]) {
  79. if (!tex) _textures[contextIndex] = tex = context.createCubeTexture(_cubeMap.size, Context3DTextureFormat.BGRA, false);
  80. _cubeMap.upload(_textures[contextIndex]);
  81. _dirty[contextIndex] = false;
  82. }
  83. return tex;
  84. }
  85. private function onContext3DDisposed(event : Stage3DEvent) : void
  86. {
  87. var stage3DProxy : Stage3DProxy = Stage3DProxy(event.target);
  88. var contextIndex : int = stage3DProxy._stage3DIndex;
  89. if (_textures[contextIndex]) {
  90. _textures[contextIndex].dispose();
  91. _textures[contextIndex] = null;
  92. }
  93. _listensForDispose[contextIndex] = false;
  94. stage3DProxy.removeEventListener(Stage3DEvent.CONTEXT3D_DISPOSED, onContext3DDisposed);
  95. }
  96. }
  97. }