/src/away3d/loaders/parsers/AWDParser.as

http://github.com/away3d/away3d-core-fp11 · ActionScript · 200 lines · 118 code · 21 blank · 61 comment · 8 complexity · d6e684c6b6bbe0fa946c1640baa2b351 MD5 · raw file

  1. package away3d.loaders.parsers
  2. {
  3. import away3d.library.assets.IAsset;
  4. import away3d.arcane;
  5. import away3d.events.AssetEvent;
  6. import away3d.events.ParserEvent;
  7. import away3d.loaders.misc.ResourceDependency;
  8. use namespace arcane;
  9. /**
  10. * The AWDParser class is a wrapper for both AWD1Parser and AWD2Parser, and will
  11. * find the right concrete parser for an AWD file.
  12. */
  13. public class AWDParser extends ParserBase
  14. {
  15. private var _parser:ParserBase;
  16. public function AWDParser()
  17. {
  18. super(ParserDataFormat.BINARY);
  19. }
  20. /**
  21. * Indicates whether or not a given file extension is supported by the parser.
  22. * @param extension The file extension of a potential file to be parsed.
  23. * @return Whether or not the given file type is supported.
  24. */
  25. public static function supportsType(suffix:String):Boolean
  26. {
  27. return (suffix.toLowerCase() == 'awd');
  28. }
  29. /**
  30. * Tests whether a data block can be parsed by the parser.
  31. * @param data The data block to potentially be parsed.
  32. * @return Whether or not the given data is supported.
  33. */
  34. public static function supportsData(data:*):Boolean
  35. {
  36. return (AWD1Parser.supportsData(data) || AWD2Parser.supportsData(data));
  37. }
  38. /**
  39. * @inheritDoc
  40. */
  41. public override function get dependencies():Vector.<ResourceDependency>
  42. {
  43. return _parser? _parser.dependencies : super.dependencies;
  44. }
  45. /**
  46. * @inheritDoc
  47. */
  48. public override function get parsingComplete():Boolean
  49. {
  50. return _parser? _parser.parsingComplete : false;
  51. }
  52. /**
  53. * @inheritDoc
  54. */
  55. public override function get parsingPaused():Boolean
  56. {
  57. return _parser? _parser.parsingPaused : false;
  58. }
  59. /**
  60. * @private
  61. * Delegate to the concrete parser.
  62. */
  63. arcane override function resolveDependency(resourceDependency:ResourceDependency):void
  64. {
  65. if (_parser)
  66. _parser.resolveDependency(resourceDependency);
  67. }
  68. /**
  69. * @private
  70. * Delegate to the concrete parser.
  71. */
  72. arcane override function resolveDependencyFailure(resourceDependency:ResourceDependency):void
  73. {
  74. if (_parser)
  75. _parser.resolveDependencyFailure(resourceDependency);
  76. }
  77. /**
  78. * @private
  79. * Delagate to the concrete parser.
  80. */
  81. arcane override function resolveDependencyName(resourceDependency:ResourceDependency, asset:IAsset):String
  82. {
  83. if (_parser)
  84. return _parser.resolveDependencyName(resourceDependency, asset);
  85. return asset.name;
  86. }
  87. arcane override function resumeParsingAfterDependencies():void
  88. {
  89. if (_parser)
  90. _parser.resumeParsingAfterDependencies();
  91. }
  92. /**
  93. * Find the right conrete parser (AWD1Parser or AWD2Parser) and delegate actual
  94. * parsing to it.
  95. */
  96. protected override function proceedParsing():Boolean
  97. {
  98. if (!_parser) {
  99. // Inspect data to find correct parser. AWD2 parser
  100. // file inspection is the most reliable
  101. if (AWD2Parser.supportsData(_data))
  102. _parser = new AWD2Parser();
  103. else
  104. _parser = new AWD1Parser();
  105. _parser.materialMode = materialMode;
  106. // Listen for events that need to be bubbled
  107. _parser.addEventListener(ParserEvent.PARSE_COMPLETE, onParseComplete);
  108. _parser.addEventListener(ParserEvent.READY_FOR_DEPENDENCIES, onReadyForDependencies);
  109. _parser.addEventListener(ParserEvent.PARSE_ERROR, onParseError);
  110. _parser.addEventListener(AssetEvent.ASSET_COMPLETE, onAssetComplete);
  111. _parser.addEventListener(AssetEvent.ANIMATION_SET_COMPLETE, onAssetComplete);
  112. _parser.addEventListener(AssetEvent.ANIMATION_STATE_COMPLETE, onAssetComplete);
  113. _parser.addEventListener(AssetEvent.ANIMATION_NODE_COMPLETE, onAssetComplete);
  114. _parser.addEventListener(AssetEvent.STATE_TRANSITION_COMPLETE, onAssetComplete);
  115. _parser.addEventListener(AssetEvent.TEXTURE_COMPLETE, onAssetComplete);
  116. _parser.addEventListener(AssetEvent.CONTAINER_COMPLETE, onAssetComplete);
  117. _parser.addEventListener(AssetEvent.GEOMETRY_COMPLETE, onAssetComplete);
  118. _parser.addEventListener(AssetEvent.MATERIAL_COMPLETE, onAssetComplete);
  119. _parser.addEventListener(AssetEvent.MESH_COMPLETE, onAssetComplete);
  120. _parser.addEventListener(AssetEvent.ENTITY_COMPLETE, onAssetComplete);
  121. _parser.addEventListener(AssetEvent.SKELETON_COMPLETE, onAssetComplete);
  122. _parser.addEventListener(AssetEvent.SKELETON_POSE_COMPLETE, onAssetComplete);
  123. _parser.parseAsync(_data);
  124. }
  125. // Return MORE_TO_PARSE while delegate parser is working. Once the delegate
  126. // finishes parsing, this dummy parser instance will be stopped as well as
  127. // a result of the delegate's PARSE_COMPLETE event (onParseComplete).
  128. return MORE_TO_PARSE;
  129. }
  130. /**
  131. * @private
  132. * Just bubble events from concrete parser.
  133. */
  134. private function onParseError(ev:ParserEvent):void
  135. {
  136. dispatchEvent(ev.clone());
  137. }
  138. /**
  139. * @private
  140. * Just bubble events from concrete parser.
  141. */
  142. private function onReadyForDependencies(ev:ParserEvent):void
  143. {
  144. dispatchEvent(ev.clone());
  145. }
  146. /**
  147. * @private
  148. * Just bubble events from concrete parser.
  149. */
  150. private function onAssetComplete(ev:AssetEvent):void
  151. {
  152. dispatchEvent(ev.clone());
  153. }
  154. /**
  155. * @private
  156. * Just bubble events from concrete parser.
  157. */
  158. private function onParseComplete(ev:ParserEvent):void
  159. {
  160. _parser.removeEventListener(ParserEvent.READY_FOR_DEPENDENCIES, onReadyForDependencies);
  161. _parser.removeEventListener(ParserEvent.PARSE_COMPLETE, onParseComplete);
  162. _parser.removeEventListener(ParserEvent.PARSE_ERROR, onParseError);
  163. _parser.removeEventListener(AssetEvent.ASSET_COMPLETE, onAssetComplete);
  164. _parser.removeEventListener(AssetEvent.ANIMATION_SET_COMPLETE, onAssetComplete);
  165. _parser.removeEventListener(AssetEvent.ANIMATION_STATE_COMPLETE, onAssetComplete);
  166. _parser.removeEventListener(AssetEvent.ANIMATION_NODE_COMPLETE, onAssetComplete);
  167. _parser.removeEventListener(AssetEvent.STATE_TRANSITION_COMPLETE, onAssetComplete);
  168. _parser.removeEventListener(AssetEvent.TEXTURE_COMPLETE, onAssetComplete);
  169. _parser.removeEventListener(AssetEvent.CONTAINER_COMPLETE, onAssetComplete);
  170. _parser.removeEventListener(AssetEvent.GEOMETRY_COMPLETE, onAssetComplete);
  171. _parser.removeEventListener(AssetEvent.MATERIAL_COMPLETE, onAssetComplete);
  172. _parser.removeEventListener(AssetEvent.MESH_COMPLETE, onAssetComplete);
  173. _parser.removeEventListener(AssetEvent.ENTITY_COMPLETE, onAssetComplete);
  174. _parser.removeEventListener(AssetEvent.SKELETON_COMPLETE, onAssetComplete);
  175. _parser.removeEventListener(AssetEvent.SKELETON_POSE_COMPLETE, onAssetComplete);
  176. finishParsing();
  177. }
  178. }
  179. }