/src/away3d/materials/BitmapFileMaterial.as

http://github.com/away3d/away3d-core-fp11 · ActionScript · 115 lines · 71 code · 18 blank · 26 comment · 10 complexity · 7f69f6fcbc83ec70dfd9c08f4cf93522 MD5 · raw file

  1. package away3d.materials
  2. {
  3. import away3d.arcane;
  4. import away3d.events.LoaderEvent;
  5. import flash.display.Bitmap;
  6. import flash.display.BitmapData;
  7. import flash.display.Loader;
  8. import flash.display.Sprite;
  9. import flash.events.Event;
  10. import flash.events.IOErrorEvent;
  11. import flash.events.ProgressEvent;
  12. import flash.net.*;
  13. import flash.system.LoaderContext;
  14. use namespace arcane;
  15. /**
  16. * Dispatched when the material completes a file load successfully.
  17. *
  18. * @eventType away3d.events.ResourceEvent
  19. */
  20. [Event(name="resourceComplete",type="away3d.events.LoaderEvent")]
  21. /**
  22. * Dispatched when the material fails to load a file.
  23. *
  24. * @eventType away3d.events.LoaderEvent
  25. */
  26. [Event(name="loadError",type="away3d.events.LoaderEvent")]
  27. /**
  28. * Dispatched every frame the material is loading.
  29. *
  30. * @eventType flash.events.ProgressEvent
  31. */
  32. [Event(name="progress",type="flash.events.ProgressEvent")]
  33. /**
  34. * Bitmap material that loads it's texture from an external bitmapasset file.
  35. */
  36. public class BitmapFileMaterial extends BitmapMaterial
  37. {
  38. private var _loader:Loader;
  39. private var _dispatcher:Sprite;
  40. private var _uri:String;
  41. /**
  42. * Creates a new <code>BitmapFileMaterial</code> object.
  43. *
  44. * @param url The location of the bitmapasset to load.
  45. */
  46. public function BitmapFileMaterial( url :String = "", checkPolicy:Boolean = false)
  47. {
  48. super(new BitmapData(64,64, false, 0xFFFFFF));
  49. url = (url.substring(0,7) == "/file:/")? url.substring(7,url.length) : url;
  50. if(url.substring(0,2) == "//"){
  51. url = url.toLowerCase();
  52. var charvar:int = 97;
  53. while(charvar<123){
  54. if(url.charCodeAt(2) == charvar){
  55. url = (url.substring(0,5) == "//"+String.fromCharCode(charvar)+":/")? url.substring(2,url.length) : url;
  56. break;
  57. }
  58. charvar++;
  59. }
  60. }
  61. if(url.charCodeAt(url.length-1) < 49)
  62. url = url.substring(0, url.length-1);
  63. _dispatcher = new Sprite();
  64. _loader = new Loader();
  65. _loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);
  66. _loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
  67. _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
  68. var context:LoaderContext = new LoaderContext();
  69. context.checkPolicyFile = checkPolicy;
  70. _uri = unescape(url);
  71. _loader.load(new URLRequest(_uri), context);
  72. }
  73. /**
  74. * @return the loader used for this material
  75. */
  76. public function get loader():Loader
  77. {
  78. return _loader;
  79. }
  80. private function onError(e:IOErrorEvent):void
  81. {
  82. if(_dispatcher.hasEventListener(LoaderEvent.LOAD_ERROR))
  83. _dispatcher.dispatchEvent(new LoaderEvent(LoaderEvent.LOAD_ERROR, _uri, e.text ));
  84. }
  85. private function onProgress(e:ProgressEvent):void
  86. {
  87. if(_dispatcher.hasEventListener(ProgressEvent.PROGRESS))
  88. _dispatcher.dispatchEvent(e);
  89. }
  90. private function onComplete(e:Event):void
  91. {
  92. bitmapData = Bitmap(_loader.content).bitmapData;
  93. if(_dispatcher.hasEventListener(LoaderEvent.RESOURCE_COMPLETE))
  94. _dispatcher.dispatchEvent(new LoaderEvent(LoaderEvent.RESOURCE_COMPLETE, _uri));
  95. }
  96. }
  97. }