Source: extern/assets.js

  1. import register from "../util/register.js";
  2. import m_assets_fact from "../intern/assets.js";
  3. /**
  4. * Low-level resource loader. In order to load exported scenes, use the {@link module:data|data} module instead.
  5. * @module assets
  6. * @local AssetRequest
  7. * @local AssetType
  8. * @local AssetCallback
  9. * @local ProgressCallback
  10. * @local PackCallback
  11. */
  12. function Assets(ns, exports) {
  13. var m_assets = m_assets_fact(ns);
  14. /**
  15. * An object that defines how the asset resource should be loaded.
  16. * @typedef {Object} AssetRequest
  17. * @property {*} id Asset identifier. Passed to the
  18. * {@link AssetCallback|AssetCallback} as a parameter. Can be unique to
  19. * distinguish asset requests if needed.
  20. * @property {AssetType} type Asset type.
  21. * @property {string} url URL of a resource.
  22. * @property {string} [request_method="GET"] Request method. Supported are "GET" and "POST".
  23. * @property {Object} [overwrite_header] An object containing fields for
  24. * overwriting request headers. For example: { "Content-Type": "image/png" }.
  25. * @property {*} [post_data] The request body that will be sent in a "POST" request.
  26. * @property {*} [param] An optional parameter that will be passed to the
  27. * {@link AssetCallback|AssetCallback}.
  28. * @cc_externs id type url request_method overwrite_header post_data param
  29. */
  30. /**
  31. * Asset type. Defines which type of data will be loaded, e.g: json, plain text,
  32. * binary buffer, ...
  33. * @typedef {number} AssetType
  34. * @see {@link module:assets.AT_ARRAYBUFFER|AT_ARRAYBUFFER},
  35. * {@link module:assets.AT_ARRAYBUFFER_ZIP|AT_ARRAYBUFFER_ZIP},
  36. * {@link module:assets.AT_JSON|AT_JSON},
  37. * {@link module:assets.AT_JSON_ZIP|AT_JSON_ZIP},
  38. * {@link module:assets.AT_TEXT|AT_TEXT},
  39. * {@link module:assets.AT_AUDIOBUFFER|AT_AUDIOBUFFER},
  40. * {@link module:assets.AT_IMAGE_ELEMENT|AT_IMAGE_ELEMENT},
  41. * {@link module:assets.AT_AUDIO_ELEMENT|AT_AUDIO_ELEMENT},
  42. * {@link module:assets.AT_VIDEO_ELEMENT|AT_VIDEO_ELEMENT},
  43. * {@link module:assets.AT_SEQ_VIDEO_ELEMENT|AT_SEQ_VIDEO_ELEMENT},
  44. */
  45. /**
  46. * Callback executed after a single asset is loaded.
  47. * @callback AssetCallback
  48. * @param {Data} data Loaded data.
  49. * @param {*} id Data asset ID.
  50. * @param {AssetType} type Data type.
  51. * @param {string} url URL of a resource.
  52. * @param {*} [opt_param] Optional parameter
  53. */
  54. /**
  55. * Callback executed after the whole pack of assets is loaded.
  56. * @callback PackCallback
  57. */
  58. /**
  59. * Callback for the progress of loading.
  60. * @callback ProgressCallback
  61. * @param {number} rate Amount of loaded data: 0 to 1.
  62. */
  63. /**
  64. * Asset type intended for loading various binary data. The loaded data will be
  65. * available as an ArrayBuffer object. Supported request methods: "GET".
  66. * @const {AssetType} module:assets.AT_ARRAYBUFFER
  67. */
  68. exports.AT_ARRAYBUFFER = m_assets.AT_ARRAYBUFFER;
  69. /**
  70. * Asset type intended for loading compressed binary data of a GZIP format. The
  71. * loaded data will be available as an ArrayBuffer object. Supported request
  72. * methods: "GET".
  73. * @const {AssetType} module:assets.AT_ARRAYBUFFER_ZIP
  74. */
  75. exports.AT_ARRAYBUFFER_ZIP = m_assets.AT_ARRAYBUFFER_ZIP;
  76. /**
  77. * Asset type intended for loading JSON files. The loaded data will be available
  78. * as a JSON object. Supported request methods: "GET", "POST".
  79. * @const {AssetType} module:assets.AT_JSON
  80. */
  81. exports.AT_JSON = m_assets.AT_JSON;
  82. /**
  83. * Asset type intended for loading JSON files compressed in a GZIP format. The
  84. * loaded data will be available as a JSON object. Supported request methods:
  85. * "GET".
  86. * @const {AssetType} module:assets.AT_JSON_ZIP
  87. */
  88. exports.AT_JSON_ZIP = m_assets.AT_JSON_ZIP;
  89. /**
  90. * Asset type intended for loading files with a plain text. The loaded data will
  91. * be available as a String object. Supported request methods: "GET", "POST".
  92. * @const {AssetType} module:assets.AT_TEXT
  93. */
  94. exports.AT_TEXT = m_assets.AT_TEXT;
  95. /**
  96. * Asset type intended for loading audio files (preferably short audio assets).
  97. * The loaded data will be available as an AudioBuffer object. Supported request
  98. * methods: "GET".
  99. * @const {AssetType} module:assets.AT_AUDIOBUFFER
  100. */
  101. exports.AT_AUDIOBUFFER = m_assets.AT_AUDIOBUFFER;
  102. /**
  103. * Asset type intended for loading common image files (JPEG, PNG, GIF). The
  104. * loaded data will be available as an HTMLImageElement object. Supported
  105. * request methods: "GET".
  106. * @const {AssetType} module:assets.AT_IMAGE_ELEMENT
  107. */
  108. exports.AT_IMAGE_ELEMENT = m_assets.AT_IMAGE_ELEMENT;
  109. /**
  110. * Asset type intended for loading common audio files. The loaded data will be
  111. * available as an HTMLAudioElement object. Supported request methods: "GET".
  112. * @const {AssetType} module:assets.AT_AUDIO_ELEMENT
  113. */
  114. exports.AT_AUDIO_ELEMENT = m_assets.AT_AUDIO_ELEMENT;
  115. /**
  116. * Asset type intended for loading common video files. The loaded data will be
  117. * available as an HTMLVideoElement object. Supported request methods: "GET".
  118. * @const {AssetType} module:assets.AT_VIDEO_ELEMENT
  119. */
  120. exports.AT_VIDEO_ELEMENT = m_assets.AT_VIDEO_ELEMENT;
  121. /**
  122. * Asset type intended for loading video files of a special ".seq" format. The
  123. * loaded data will be available as an object of the following structure:
  124. * { images: [HTMLImageElement, ...], fps: number }. Supported request methods:
  125. * "GET".
  126. * @see https://www.blend4web.com/doc/en/developers.html#seq-video-format
  127. * @const {AssetType} module:assets.AT_SEQ_VIDEO_ELEMENT
  128. */
  129. exports.AT_SEQ_VIDEO_ELEMENT = m_assets.AT_SEQ_VIDEO_ELEMENT;
  130. /**
  131. * Add the assets to the loading queue.
  132. * @method module:assets.enqueue
  133. * @param {AssetRequest[]} assets_pack Array of the asset requests.
  134. * @param {AssetCallback} [asset_cb] Callback executed after a single asset is loaded
  135. * @param {PackCallback} [pack_cb] Callback executed after the whole pack of assets is loaded
  136. * @param {ProgressCallback} [progress_cb] Callback for the progress of loading.
  137. * @example var m_assets = require("assets");
  138. *
  139. * var asset_cb = function(data, id, type, url) {
  140. * console.log("LOADED:", url);
  141. * }
  142. *
  143. * var pack_cb() {
  144. * console.log("ALL DATA LOADED!");
  145. * }
  146. *
  147. * var progress_cb = function(rate) {
  148. * console.log(rate * 100 + "% LOADED");
  149. * }
  150. *
  151. * m_assets.enqueue([
  152. * {id: "my_json001", type: m_assets.AT_JSON, url: "./my_json.json"},
  153. * {id: "my_img001", type: m_assets.AT_IMAGE_ELEMENT, url: "./my_image.jpg"}
  154. * ], asset_cb, pack_cb, progress_cb);
  155. */
  156. exports.enqueue = function(assets_pack, asset_cb, pack_cb, progress_cb) {
  157. if (assets_pack.length)
  158. m_assets.enqueue(assets_pack, asset_cb, pack_cb, progress_cb);
  159. }
  160. }
  161. var assets_factory = register("assets", Assets);
  162. export default assets_factory;