babylon.sceneLoader.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. var BABYLON;
  2. (function (BABYLON) {
  3. var SceneLoader = (function () {
  4. function SceneLoader() {
  5. }
  6. Object.defineProperty(SceneLoader, "NO_LOGGING", {
  7. get: function () {
  8. return 0;
  9. },
  10. enumerable: true,
  11. configurable: true
  12. });
  13. Object.defineProperty(SceneLoader, "MINIMAL_LOGGING", {
  14. get: function () {
  15. return 1;
  16. },
  17. enumerable: true,
  18. configurable: true
  19. });
  20. Object.defineProperty(SceneLoader, "SUMMARY_LOGGING", {
  21. get: function () {
  22. return 2;
  23. },
  24. enumerable: true,
  25. configurable: true
  26. });
  27. Object.defineProperty(SceneLoader, "DETAILED_LOGGING", {
  28. get: function () {
  29. return 3;
  30. },
  31. enumerable: true,
  32. configurable: true
  33. });
  34. Object.defineProperty(SceneLoader, "ForceFullSceneLoadingForIncremental", {
  35. get: function () {
  36. return SceneLoader._ForceFullSceneLoadingForIncremental;
  37. },
  38. set: function (value) {
  39. SceneLoader._ForceFullSceneLoadingForIncremental = value;
  40. },
  41. enumerable: true,
  42. configurable: true
  43. });
  44. Object.defineProperty(SceneLoader, "ShowLoadingScreen", {
  45. get: function () {
  46. return SceneLoader._ShowLoadingScreen;
  47. },
  48. set: function (value) {
  49. SceneLoader._ShowLoadingScreen = value;
  50. },
  51. enumerable: true,
  52. configurable: true
  53. });
  54. Object.defineProperty(SceneLoader, "loggingLevel", {
  55. get: function () {
  56. return SceneLoader._loggingLevel;
  57. },
  58. set: function (value) {
  59. SceneLoader._loggingLevel = value;
  60. },
  61. enumerable: true,
  62. configurable: true
  63. });
  64. SceneLoader._getPluginForFilename = function (sceneFilename) {
  65. var dotPosition = sceneFilename.lastIndexOf(".");
  66. var queryStringPosition = sceneFilename.indexOf("?");
  67. if (queryStringPosition === -1) {
  68. queryStringPosition = sceneFilename.length;
  69. }
  70. var extension = sceneFilename.substring(dotPosition, queryStringPosition).toLowerCase();
  71. for (var index = 0; index < this._registeredPlugins.length; index++) {
  72. var plugin = this._registeredPlugins[index];
  73. if (plugin.extensions.indexOf(extension) !== -1) {
  74. return plugin;
  75. }
  76. }
  77. return this._registeredPlugins[0];
  78. };
  79. // Public functions
  80. SceneLoader.GetPluginForExtension = function (extension) {
  81. for (var index = 0; index < this._registeredPlugins.length; index++) {
  82. var plugin = this._registeredPlugins[index];
  83. if (plugin.extensions.indexOf(extension) !== -1) {
  84. return plugin;
  85. }
  86. }
  87. return null;
  88. };
  89. SceneLoader.RegisterPlugin = function (plugin) {
  90. plugin.extensions = plugin.extensions.toLowerCase();
  91. SceneLoader._registeredPlugins.push(plugin);
  92. };
  93. SceneLoader.ImportMesh = function (meshesNames, rootUrl, sceneFilename, scene, onsuccess, progressCallBack, onerror) {
  94. if (sceneFilename.substr && sceneFilename.substr(0, 1) === "/") {
  95. BABYLON.Tools.Error("Wrong sceneFilename parameter");
  96. return;
  97. }
  98. if (sceneFilename.substr && sceneFilename.substr(0, 1) === "/") {
  99. BABYLON.Tools.Error("Wrong sceneFilename parameter");
  100. return;
  101. }
  102. var loadingToken = {};
  103. scene._addPendingData(loadingToken);
  104. var manifestChecked = function (success) {
  105. scene.database = database;
  106. var plugin = SceneLoader._getPluginForFilename(sceneFilename);
  107. var importMeshFromData = function (data) {
  108. var meshes = [];
  109. var particleSystems = [];
  110. var skeletons = [];
  111. try {
  112. if (plugin.importMesh) {
  113. var syncedPlugin = plugin;
  114. if (!syncedPlugin.importMesh(meshesNames, scene, data, rootUrl, meshes, particleSystems, skeletons)) {
  115. if (onerror) {
  116. onerror(scene, 'Unable to import meshes from ' + rootUrl + sceneFilename);
  117. }
  118. scene._removePendingData(loadingToken);
  119. return;
  120. }
  121. if (onsuccess) {
  122. scene.importedMeshesFiles.push(rootUrl + sceneFilename);
  123. onsuccess(meshes, particleSystems, skeletons);
  124. scene._removePendingData(loadingToken);
  125. }
  126. }
  127. else {
  128. var asyncedPlugin = plugin;
  129. asyncedPlugin.importMeshAsync(meshesNames, scene, data, rootUrl, function (meshes, particleSystems, skeletons) {
  130. if (onsuccess) {
  131. scene.importedMeshesFiles.push(rootUrl + sceneFilename);
  132. onsuccess(meshes, particleSystems, skeletons);
  133. scene._removePendingData(loadingToken);
  134. }
  135. }, function () {
  136. if (onerror) {
  137. onerror(scene, 'Unable to import meshes from ' + rootUrl + sceneFilename);
  138. }
  139. scene._removePendingData(loadingToken);
  140. });
  141. }
  142. }
  143. catch (e) {
  144. if (onerror) {
  145. onerror(scene, 'Unable to import meshes from ' + rootUrl + sceneFilename, e);
  146. }
  147. scene._removePendingData(loadingToken);
  148. }
  149. };
  150. if (sceneFilename.substr && sceneFilename.substr(0, 5) === "data:") {
  151. // Direct load
  152. importMeshFromData(sceneFilename.substr(5));
  153. return;
  154. }
  155. BABYLON.Tools.LoadFile(rootUrl + sceneFilename, function (data) {
  156. importMeshFromData(data);
  157. }, progressCallBack, database);
  158. };
  159. if (scene.getEngine().enableOfflineSupport && !(sceneFilename.substr && sceneFilename.substr(0, 5) === "data:")) {
  160. // Checking if a manifest file has been set for this scene and if offline mode has been requested
  161. var database = new BABYLON.Database(rootUrl + sceneFilename, manifestChecked);
  162. }
  163. else {
  164. // If the scene is a data stream or offline support is not enabled, it's a direct load
  165. manifestChecked(true);
  166. }
  167. };
  168. /**
  169. * Load a scene
  170. * @param rootUrl a string that defines the root url for scene and resources
  171. * @param sceneFilename a string that defines the name of the scene file. can start with "data:" following by the stringified version of the scene
  172. * @param engine is the instance of BABYLON.Engine to use to create the scene
  173. */
  174. SceneLoader.Load = function (rootUrl, sceneFilename, engine, onsuccess, progressCallBack, onerror) {
  175. SceneLoader.Append(rootUrl, sceneFilename, new BABYLON.Scene(engine), onsuccess, progressCallBack, onerror);
  176. };
  177. /**
  178. * Append a scene
  179. * @param rootUrl a string that defines the root url for scene and resources
  180. * @param sceneFilename a string that defines the name of the scene file. can start with "data:" following by the stringified version of the scene
  181. * @param scene is the instance of BABYLON.Scene to append to
  182. */
  183. SceneLoader.Append = function (rootUrl, sceneFilename, scene, onsuccess, progressCallBack, onerror) {
  184. if (sceneFilename.substr && sceneFilename.substr(0, 1) === "/") {
  185. BABYLON.Tools.Error("Wrong sceneFilename parameter");
  186. return;
  187. }
  188. var plugin = this._getPluginForFilename(sceneFilename.name || sceneFilename);
  189. var database;
  190. var loadingToken = {};
  191. scene._addPendingData(loadingToken);
  192. if (SceneLoader.ShowLoadingScreen) {
  193. scene.getEngine().displayLoadingUI();
  194. }
  195. var loadSceneFromData = function (data) {
  196. scene.database = database;
  197. if (plugin.load) {
  198. var syncedPlugin = plugin;
  199. if (!syncedPlugin.load(scene, data, rootUrl)) {
  200. if (onerror) {
  201. onerror(scene);
  202. }
  203. scene._removePendingData(loadingToken);
  204. scene.getEngine().hideLoadingUI();
  205. return;
  206. }
  207. if (onsuccess) {
  208. onsuccess(scene);
  209. }
  210. scene._removePendingData(loadingToken);
  211. }
  212. else {
  213. var asyncedPlugin = plugin;
  214. asyncedPlugin.loadAsync(scene, data, rootUrl, function () {
  215. if (onsuccess) {
  216. onsuccess(scene);
  217. }
  218. }, function () {
  219. if (onerror) {
  220. onerror(scene);
  221. }
  222. scene._removePendingData(loadingToken);
  223. scene.getEngine().hideLoadingUI();
  224. });
  225. }
  226. if (SceneLoader.ShowLoadingScreen) {
  227. scene.executeWhenReady(function () {
  228. scene.getEngine().hideLoadingUI();
  229. });
  230. }
  231. };
  232. var manifestChecked = function (success) {
  233. BABYLON.Tools.LoadFile(rootUrl + sceneFilename, loadSceneFromData, progressCallBack, database);
  234. };
  235. if (sceneFilename.substr && sceneFilename.substr(0, 5) === "data:") {
  236. // Direct load
  237. loadSceneFromData(sceneFilename.substr(5));
  238. return;
  239. }
  240. if (rootUrl.indexOf("file:") === -1) {
  241. if (scene.getEngine().enableOfflineSupport) {
  242. // Checking if a manifest file has been set for this scene and if offline mode has been requested
  243. database = new BABYLON.Database(rootUrl + sceneFilename, manifestChecked);
  244. }
  245. else {
  246. manifestChecked(true);
  247. }
  248. }
  249. else {
  250. BABYLON.Tools.ReadFile(sceneFilename, loadSceneFromData, progressCallBack);
  251. }
  252. };
  253. // Flags
  254. SceneLoader._ForceFullSceneLoadingForIncremental = false;
  255. SceneLoader._ShowLoadingScreen = true;
  256. SceneLoader._loggingLevel = SceneLoader.NO_LOGGING;
  257. // Members
  258. SceneLoader._registeredPlugins = new Array();
  259. return SceneLoader;
  260. })();
  261. BABYLON.SceneLoader = SceneLoader;
  262. ;
  263. })(BABYLON || (BABYLON = {}));