frame.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. import { utils } from "mocha";
  2. (function() {
  3. var snippetUrl = "https://snippet.babylonjs.com";
  4. var currentSnippetToken;
  5. var engine;
  6. var fpsLabel = document.getElementById("fpsLabel");
  7. var refreshAnchor = document.getElementById("refresh");
  8. var editAnchor = document.getElementById("edit");
  9. var scripts;
  10. var zipCode;
  11. if (location.href.toLowerCase().indexOf("noui") > -1) {
  12. fpsLabel.style.visibility = "hidden";
  13. fpsLabel.style.display = "none";
  14. refreshAnchor.style.visibility = "hidden";
  15. refreshAnchor.style.display = "none";
  16. editAnchor.style.visibility = "hidden";
  17. editAnchor.style.display = "none";
  18. }
  19. BABYLON.Engine.ShadersRepository = "/src/Shaders/";
  20. var loadScript = function(scriptURL, title) {
  21. var xhr = new XMLHttpRequest();
  22. xhr.open('GET', scriptURL, true);
  23. xhr.onreadystatechange = function() {
  24. if (xhr.readyState === 4) {
  25. if (xhr.status === 200) {
  26. monacoCreator.BlockEditorChange.lockEditorChange = true;
  27. console.log(xhr.responseText);
  28. jsEditor.setValue(xhr.responseText);
  29. jsEditor.setPosition({ lineNumber: 0, column: 0 });
  30. monacoCreator.BlockEditorChange = false;
  31. compileAndRun();
  32. document.getElementById("currentScript").innerHTML = title;
  33. currentSnippetToken = null;
  34. }
  35. }
  36. };
  37. xhr.send(null);
  38. };
  39. var showError = function(error) {
  40. utils.showError(error, null);
  41. };
  42. compileAndRun = function(code) {
  43. try {
  44. if (!BABYLON.Engine.isSupported()) {
  45. showError("Your browser does not support WebGL");
  46. return;
  47. }
  48. if (engine) {
  49. engine.dispose();
  50. engine = null;
  51. }
  52. var canvas = document.getElementById("renderCanvas");
  53. var checkCamera = true;
  54. var wrappedEval = false;
  55. var createEngineFunction = "createDefaultEngine";
  56. var createSceneFunction;
  57. var createDefaultEngine = function() {
  58. return new BABYLON.Engine(canvas, true, { stencil: true });
  59. }
  60. var scene;
  61. if (code.indexOf("createEngine") !== -1) {
  62. createEngineFunction = "createEngine";
  63. }
  64. if (code.indexOf("delayCreateScene") !== -1) { // createScene
  65. createSceneFunction = "delayCreateScene";
  66. checkCamera = false;
  67. } else if (code.indexOf("createScene") !== -1) { // createScene
  68. createSceneFunction = "createScene";
  69. } else if (code.indexOf("CreateScene") !== -1) { // CreateScene
  70. createSceneFunction = "CreateScene";
  71. } else if (code.indexOf("createscene") !== -1) { // createscene
  72. createSceneFunction = "createscene";
  73. }
  74. if (!createSceneFunction) {
  75. // just pasted code.
  76. engine = createDefaultEngine();
  77. scene = new BABYLON.Scene(engine);
  78. eval("runScript = function(scene, canvas) {" + code + "}");
  79. runScript(scene, canvas);
  80. zipCode = "var scene = new BABYLON.Scene(engine);\r\n\r\n" + code;
  81. } else {
  82. //execute the code
  83. eval(code);
  84. //create engine
  85. eval("engine = " + createEngineFunction + "()");
  86. if (!engine) {
  87. showError("createEngine function must return an engine.", null);
  88. return;
  89. }
  90. //create scene
  91. eval("scene = " + createSceneFunction + "()");
  92. if (!scene) {
  93. showError(createSceneFunction + " function must return a scene.", null);
  94. return;
  95. }
  96. // update the scene code for the zip file
  97. zipCode = code + "\r\n\r\nvar scene = " + createSceneFunction + "()";
  98. }
  99. BABYLON.Camera.ForceAttachControlToAlwaysPreventDefault = true;
  100. engine.runRenderLoop(function() {
  101. if (engine.scenes.length === 0) {
  102. return;
  103. }
  104. if (canvas.width !== canvas.clientWidth) {
  105. engine.resize();
  106. }
  107. var scene = engine.scenes[0];
  108. if (scene.activeCamera || scene.activeCameras.length > 0) {
  109. scene.render();
  110. }
  111. if (fpsLabel) {
  112. fpsLabel.innerHTML = engine.getFps().toFixed() + " fps";
  113. }
  114. });
  115. } catch (e) {
  116. // showError(e.message);
  117. }
  118. };
  119. window.addEventListener("resize", function() {
  120. if (engine) {
  121. engine.resize();
  122. }
  123. });
  124. // UI
  125. var cleanHash = function() {
  126. var splits = decodeURIComponent(location.hash.substr(1)).split("#");
  127. if (splits.length > 2) {
  128. splits.splice(2, splits.length - 2);
  129. }
  130. location.hash = splits.join("#");
  131. };
  132. var checkHash = function() {
  133. if (location.hash) {
  134. cleanHash();
  135. try {
  136. var xmlHttp = new XMLHttpRequest();
  137. xmlHttp.onreadystatechange = function() {
  138. if (xmlHttp.readyState === 4) {
  139. if (xmlHttp.status === 200) {
  140. var snippetCode = JSON.parse(JSON.parse(xmlHttp.responseText).jsonPayload).code;
  141. compileAndRun(snippetCode);
  142. var refresh = document.getElementById("refresh");
  143. if (refresh) {
  144. refresh.addEventListener("click", function() {
  145. compileAndRun(snippetCode);
  146. });
  147. }
  148. }
  149. }
  150. };
  151. var hash = location.hash.substr(1);
  152. currentSnippetToken = hash.split("#")[0];
  153. if (!hash.split("#")[1]) hash += "#0";
  154. xmlHttp.open("GET", snippetUrl + "/" + hash.replace("#", "/"));
  155. xmlHttp.send();
  156. var edit = document.getElementById("edit");
  157. if (edit) {
  158. edit.href = "//www.babylonjs-playground.com/#" + hash;
  159. }
  160. } catch (e) {
  161. }
  162. }
  163. };
  164. checkHash();
  165. })();