babylon.sceneLoader.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  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._getDefaultPlugin = function () {
  65. return SceneLoader._registeredPlugins[".babylon"];
  66. };
  67. SceneLoader._getPluginForExtension = function (extension) {
  68. var registeredPlugin = SceneLoader._registeredPlugins[extension];
  69. if (registeredPlugin) {
  70. return registeredPlugin;
  71. }
  72. return SceneLoader._getDefaultPlugin();
  73. };
  74. SceneLoader._getPluginForFilename = function (sceneFilename) {
  75. if (sceneFilename.name) {
  76. sceneFilename = sceneFilename.name;
  77. }
  78. var dotPosition = sceneFilename.lastIndexOf(".");
  79. var queryStringPosition = sceneFilename.indexOf("?");
  80. if (queryStringPosition === -1) {
  81. queryStringPosition = sceneFilename.length;
  82. }
  83. var extension = sceneFilename.substring(dotPosition, queryStringPosition).toLowerCase();
  84. return SceneLoader._getPluginForExtension(extension);
  85. };
  86. // use babylon file loader directly if sceneFilename is prefixed with "data:"
  87. SceneLoader._getDirectLoad = function (sceneFilename) {
  88. if (sceneFilename.substr && sceneFilename.substr(0, 5) === "data:") {
  89. return sceneFilename.substr(5);
  90. }
  91. return null;
  92. };
  93. // Public functions
  94. SceneLoader.GetPluginForExtension = function (extension) {
  95. return SceneLoader._getPluginForExtension(extension).plugin;
  96. };
  97. SceneLoader.RegisterPlugin = function (plugin) {
  98. if (typeof plugin.extensions === "string") {
  99. var extension = plugin.extensions;
  100. SceneLoader._registeredPlugins[extension.toLowerCase()] = {
  101. plugin: plugin,
  102. isBinary: false
  103. };
  104. }
  105. else {
  106. var extensions = plugin.extensions;
  107. Object.keys(extensions).forEach(function (extension) {
  108. SceneLoader._registeredPlugins[extension.toLowerCase()] = {
  109. plugin: plugin,
  110. isBinary: extensions[extension].isBinary
  111. };
  112. });
  113. }
  114. };
  115. SceneLoader.ImportMesh = function (meshesNames, rootUrl, sceneFilename, scene, onsuccess, progressCallBack, onerror) {
  116. if (sceneFilename.substr && sceneFilename.substr(0, 1) === "/") {
  117. BABYLON.Tools.Error("Wrong sceneFilename parameter");
  118. return;
  119. }
  120. if (sceneFilename.substr && sceneFilename.substr(0, 1) === "/") {
  121. BABYLON.Tools.Error("Wrong sceneFilename parameter");
  122. return;
  123. }
  124. var directLoad = SceneLoader._getDirectLoad(sceneFilename);
  125. var loadingToken = {};
  126. scene._addPendingData(loadingToken);
  127. var manifestChecked = function (success) {
  128. scene.database = database;
  129. var registeredPlugin = directLoad ? SceneLoader._getDefaultPlugin() : SceneLoader._getPluginForFilename(sceneFilename);
  130. var plugin = registeredPlugin.plugin;
  131. var useArrayBuffer = registeredPlugin.isBinary;
  132. var importMeshFromData = function (data) {
  133. var meshes = [];
  134. var particleSystems = [];
  135. var skeletons = [];
  136. try {
  137. if (plugin.importMesh) {
  138. var syncedPlugin = plugin;
  139. if (!syncedPlugin.importMesh(meshesNames, scene, data, rootUrl, meshes, particleSystems, skeletons)) {
  140. if (onerror) {
  141. onerror(scene, 'Unable to import meshes from ' + rootUrl + sceneFilename);
  142. }
  143. scene._removePendingData(loadingToken);
  144. return;
  145. }
  146. if (onsuccess) {
  147. scene.importedMeshesFiles.push(rootUrl + sceneFilename);
  148. onsuccess(meshes, particleSystems, skeletons);
  149. scene._removePendingData(loadingToken);
  150. }
  151. }
  152. else {
  153. var asyncedPlugin = plugin;
  154. asyncedPlugin.importMeshAsync(meshesNames, scene, data, rootUrl, function (meshes, particleSystems, skeletons) {
  155. if (onsuccess) {
  156. scene.importedMeshesFiles.push(rootUrl + sceneFilename);
  157. onsuccess(meshes, particleSystems, skeletons);
  158. scene._removePendingData(loadingToken);
  159. }
  160. }, function () {
  161. if (onerror) {
  162. onerror(scene, 'Unable to import meshes from ' + rootUrl + sceneFilename);
  163. }
  164. scene._removePendingData(loadingToken);
  165. });
  166. }
  167. }
  168. catch (e) {
  169. if (onerror) {
  170. onerror(scene, 'Unable to import meshes from ' + rootUrl + sceneFilename, e);
  171. }
  172. scene._removePendingData(loadingToken);
  173. }
  174. };
  175. if (directLoad) {
  176. importMeshFromData(directLoad);
  177. return;
  178. }
  179. BABYLON.Tools.LoadFile(rootUrl + sceneFilename, function (data) {
  180. importMeshFromData(data);
  181. }, progressCallBack, database, useArrayBuffer);
  182. };
  183. if (scene.getEngine().enableOfflineSupport && !directLoad) {
  184. // Checking if a manifest file has been set for this scene and if offline mode has been requested
  185. var database = new BABYLON.Database(rootUrl + sceneFilename, manifestChecked);
  186. }
  187. else {
  188. // If the scene is a data stream or offline support is not enabled, it's a direct load
  189. manifestChecked(true);
  190. }
  191. };
  192. /**
  193. * Load a scene
  194. * @param rootUrl a string that defines the root url for scene and resources
  195. * @param sceneFilename a string that defines the name of the scene file. can start with "data:" following by the stringified version of the scene
  196. * @param engine is the instance of BABYLON.Engine to use to create the scene
  197. */
  198. SceneLoader.Load = function (rootUrl, sceneFilename, engine, onsuccess, progressCallBack, onerror) {
  199. SceneLoader.Append(rootUrl, sceneFilename, new BABYLON.Scene(engine), onsuccess, progressCallBack, onerror);
  200. };
  201. /**
  202. * Append a scene
  203. * @param rootUrl a string that defines the root url for scene and resources
  204. * @param sceneFilename a string that defines the name of the scene file. can start with "data:" following by the stringified version of the scene
  205. * @param scene is the instance of BABYLON.Scene to append to
  206. */
  207. SceneLoader.Append = function (rootUrl, sceneFilename, scene, onsuccess, progressCallBack, onerror) {
  208. if (sceneFilename.substr && sceneFilename.substr(0, 1) === "/") {
  209. BABYLON.Tools.Error("Wrong sceneFilename parameter");
  210. return;
  211. }
  212. var directLoad = SceneLoader._getDirectLoad(sceneFilename);
  213. var registeredPlugin = directLoad ? SceneLoader._getDefaultPlugin() : SceneLoader._getPluginForFilename(sceneFilename);
  214. var plugin = registeredPlugin.plugin;
  215. var useArrayBuffer = registeredPlugin.isBinary;
  216. var database;
  217. var loadingToken = {};
  218. scene._addPendingData(loadingToken);
  219. if (SceneLoader.ShowLoadingScreen) {
  220. scene.getEngine().displayLoadingUI();
  221. }
  222. var loadSceneFromData = function (data) {
  223. scene.database = database;
  224. if (plugin.load) {
  225. var syncedPlugin = plugin;
  226. if (!syncedPlugin.load(scene, data, rootUrl)) {
  227. if (onerror) {
  228. onerror(scene);
  229. }
  230. scene._removePendingData(loadingToken);
  231. scene.getEngine().hideLoadingUI();
  232. return;
  233. }
  234. if (onsuccess) {
  235. onsuccess(scene);
  236. }
  237. scene._removePendingData(loadingToken);
  238. }
  239. else {
  240. var asyncedPlugin = plugin;
  241. asyncedPlugin.loadAsync(scene, data, rootUrl, function () {
  242. if (onsuccess) {
  243. onsuccess(scene);
  244. }
  245. scene._removePendingData(loadingToken);
  246. }, function () {
  247. if (onerror) {
  248. onerror(scene);
  249. }
  250. scene._removePendingData(loadingToken);
  251. scene.getEngine().hideLoadingUI();
  252. });
  253. }
  254. if (SceneLoader.ShowLoadingScreen) {
  255. scene.executeWhenReady(function () {
  256. scene.getEngine().hideLoadingUI();
  257. });
  258. }
  259. };
  260. var manifestChecked = function (success) {
  261. BABYLON.Tools.LoadFile(rootUrl + sceneFilename, loadSceneFromData, progressCallBack, database, useArrayBuffer);
  262. };
  263. if (directLoad) {
  264. loadSceneFromData(directLoad);
  265. return;
  266. }
  267. if (rootUrl.indexOf("file:") === -1) {
  268. if (scene.getEngine().enableOfflineSupport) {
  269. // Checking if a manifest file has been set for this scene and if offline mode has been requested
  270. database = new BABYLON.Database(rootUrl + sceneFilename, manifestChecked);
  271. }
  272. else {
  273. manifestChecked(true);
  274. }
  275. }
  276. else {
  277. BABYLON.Tools.ReadFile(sceneFilename, loadSceneFromData, progressCallBack, useArrayBuffer);
  278. }
  279. };
  280. // Flags
  281. SceneLoader._ForceFullSceneLoadingForIncremental = false;
  282. SceneLoader._ShowLoadingScreen = true;
  283. SceneLoader._loggingLevel = SceneLoader.NO_LOGGING;
  284. // Members
  285. SceneLoader._registeredPlugins = {};
  286. return SceneLoader;
  287. }());
  288. BABYLON.SceneLoader = SceneLoader;
  289. ;
  290. })(BABYLON || (BABYLON = {}));