babylon.sceneLoader.tests.ts 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. /**
  2. * Describes the test suite.
  3. */
  4. describe('Babylon Scene Loader', function () {
  5. let subject: BABYLON.Engine;
  6. this.timeout(10000);
  7. /**
  8. * Loads the dependencies.
  9. */
  10. before(function (done) {
  11. this.timeout(180000);
  12. (BABYLONDEVTOOLS).Loader
  13. .useDist()
  14. .load(function () {
  15. // Force apply promise polyfill for consistent behavior between PhantomJS, IE11, and other browsers.
  16. BABYLON.PromisePolyfill.Apply(true);
  17. done();
  18. });
  19. });
  20. /**
  21. * Create a new engine subject before each test.
  22. */
  23. beforeEach(function () {
  24. subject = new BABYLON.NullEngine({
  25. renderHeight: 256,
  26. renderWidth: 256,
  27. textureSize: 256,
  28. deterministicLockstep: false,
  29. lockstepMaxSteps: 1
  30. });
  31. });
  32. /**
  33. * Integration tests for loading glTF assets.
  34. */
  35. describe('#glTF', () => {
  36. it('Load BoomBox', () => {
  37. const scene = new BABYLON.Scene(subject);
  38. return BABYLON.SceneLoader.AppendAsync("/Playground/scenes/BoomBox/", "BoomBox.gltf", scene);
  39. });
  40. it('Load BoomBox GLB', () => {
  41. const scene = new BABYLON.Scene(subject);
  42. return BABYLON.SceneLoader.AppendAsync("/Playground/scenes/", "BoomBox.glb", scene);
  43. });
  44. it('Load BoomBox with callbacks', () => {
  45. let parsedCount = 0;
  46. let primaryMeshLoadCount = 0;
  47. let primaryMaterialLoadCount = 0;
  48. let textureLoadCounts: { [name: string]: number } = {};
  49. let ready = false;
  50. const deferred = new BABYLON.Deferred();
  51. BABYLON.SceneLoader.OnPluginActivatedObservable.add((loader: BABYLON.GLTFFileLoader) => {
  52. loader.onParsed = data => {
  53. parsedCount++;
  54. };
  55. loader.onMeshLoaded = mesh => {
  56. if (mesh.name === "BoomBox") {
  57. primaryMeshLoadCount++;
  58. }
  59. };
  60. loader.onMaterialLoaded = material => {
  61. if (material.name === "BoomBox_Mat") {
  62. primaryMaterialLoadCount++;
  63. }
  64. };
  65. loader.onTextureLoaded = texture => {
  66. textureLoadCounts[texture.name] = textureLoadCounts[texture.name] || 0;
  67. textureLoadCounts[texture.name]++;
  68. };
  69. loader.onComplete = () => {
  70. try {
  71. expect(ready, "ready").to.be.true;
  72. deferred.resolve();
  73. }
  74. catch (e) {
  75. deferred.reject(e);
  76. }
  77. };
  78. }, undefined, undefined, undefined, true);
  79. const scene = new BABYLON.Scene(subject);
  80. const promise = BABYLON.SceneLoader.AppendAsync("/Playground/scenes/BoomBox/", "BoomBox.gltf", scene).then(() => {
  81. ready = true;
  82. expect(parsedCount, "parsedCount").to.equal(1);
  83. expect(primaryMeshLoadCount, "primaryMeshLoadCount").to.equal(1);
  84. expect(primaryMaterialLoadCount, "primaryMaterialLoadCount").to.equal(1);
  85. const expectedTextureLoadCounts = {
  86. "baseColor": 1,
  87. "occlusionRoughnessMetallic": 2,
  88. "normal": 1,
  89. "emissive": 1
  90. };
  91. expect(Object.keys(textureLoadCounts), "Object.keys(textureLoadCounts)").to.have.lengthOf(Object.keys(expectedTextureLoadCounts).length);
  92. for (const textureName in expectedTextureLoadCounts) {
  93. expect(textureLoadCounts, "textureLoadCounts").to.have.property(textureName, expectedTextureLoadCounts[textureName]);
  94. }
  95. });
  96. return Promise.all([promise, deferred.promise]);
  97. });
  98. it('Load BoomBox with dispose', () => {
  99. let ready = false;
  100. let disposed = false;
  101. const deferred = new BABYLON.Deferred<void>();
  102. BABYLON.SceneLoader.OnPluginActivatedObservable.add((loader: BABYLON.GLTFFileLoader) => {
  103. loader.onDispose = () => {
  104. disposed = true;
  105. };
  106. BABYLON.Tools.DelayAsync(50).then(() => {
  107. loader.dispose();
  108. expect(ready, "ready").to.be.false;
  109. expect(disposed, "disposed").to.be.true;
  110. deferred.resolve();
  111. }).catch(error => {
  112. deferred.reject(error);
  113. });
  114. }, undefined, undefined, undefined, true);
  115. const scene = new BABYLON.Scene(subject);
  116. BABYLON.SceneLoader.AppendAsync("/Playground/scenes/BoomBox/", "BoomBox2.gltf", scene).then(() => {
  117. ready = true;
  118. }).catch(error => {
  119. // Cannot rely on the typical error handling of promises since the AppendAsync is not
  120. // supposed to complete because the loader is being disposed.
  121. deferred.reject(error);
  122. });
  123. return deferred.promise;
  124. });
  125. it('Load BoomBox with compileMaterials', () => {
  126. let createShaderProgramSpy: sinon.SinonSpy;
  127. const deferred = new BABYLON.Deferred();
  128. BABYLON.SceneLoader.OnPluginActivatedObservable.add((loader: BABYLON.GLTFFileLoader) => {
  129. loader.compileMaterials = true;
  130. loader.onComplete = () => {
  131. try {
  132. expect(createShaderProgramSpy.called, "createShaderProgramSpy.called").to.be.false;
  133. deferred.resolve();
  134. }
  135. catch (e) {
  136. deferred.reject(e);
  137. }
  138. finally {
  139. createShaderProgramSpy.restore();
  140. }
  141. };
  142. }, undefined, undefined, undefined, true);
  143. const scene = new BABYLON.Scene(subject);
  144. const promise = BABYLON.SceneLoader.AppendAsync("/Playground/scenes/BoomBox/", "BoomBox.gltf", scene).then(() => {
  145. createShaderProgramSpy = sinon.spy(subject, "createShaderProgram");
  146. });
  147. return Promise.all([promise, deferred.promise, scene.whenReadyAsync()]);
  148. });
  149. // TODO: test material instancing
  150. // TODO: test ImportMesh with specific node name
  151. // TODO: test KHR_materials_pbrSpecularGlossiness
  152. // TODO: test MSFT_lod
  153. // TODO: test KHR_lights
  154. });
  155. describe('#AssetContainer', () => {
  156. it('should be loaded from BoomBox GLTF', () => {
  157. var scene = new BABYLON.Scene(subject);
  158. return BABYLON.SceneLoader.LoadAssetContainerAsync("/Playground/scenes/BoomBox/", "BoomBox.gltf", scene).then(container => {
  159. expect(container.meshes.length).to.eq(2);
  160. });
  161. });
  162. it('should be adding and removing objects from scene', () => {
  163. // Create a scene with some assets
  164. var scene = new BABYLON.Scene(subject);
  165. var camera = new BABYLON.FreeCamera("camera1", new BABYLON.Vector3(0, 5, -10), scene);
  166. var light = new BABYLON.HemisphericLight("light1", new BABYLON.Vector3(0, 1, 0), scene);
  167. var sphere = BABYLON.Mesh.CreateSphere("sphere1", 16, 2, scene);
  168. var ground = BABYLON.Mesh.CreateGround("ground1", 6, 6, 2, scene);
  169. // Move all the assets from the scene into a container
  170. var container = new BABYLON.AssetContainer(scene);
  171. var keepAssets = new BABYLON.KeepAssets();
  172. keepAssets.cameras.push(camera);
  173. container.moveAllFromScene(keepAssets);
  174. expect(scene.cameras.length).to.eq(1);
  175. expect(scene.meshes.length).to.eq(0);
  176. expect(scene.lights.length).to.eq(0);
  177. expect(container.cameras.length).to.eq(0);
  178. expect(container.meshes.length).to.eq(2);
  179. expect(container.lights.length).to.eq(1);
  180. // Add them back and then remove again
  181. container.addAllToScene();
  182. expect(scene.cameras.length).to.eq(1);
  183. expect(scene.meshes.length).to.eq(2);
  184. expect(scene.lights.length).to.eq(1);
  185. container.removeAllFromScene();
  186. expect(scene.cameras.length).to.eq(1);
  187. expect(scene.meshes.length).to.eq(0);
  188. expect(scene.lights.length).to.eq(0);
  189. });
  190. });
  191. });