frame.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. (function () {
  2. var snippetUrl = "https://babylonjs-api2.azurewebsites.net/snippets";
  3. var currentSnippetToken;
  4. var engine;
  5. var fpsLabel = document.getElementById("fpsLabel");
  6. var scripts;
  7. var zipCode;
  8. BABYLON.Engine.ShadersRepository = "/src/Shaders/";
  9. var loadScript = function (scriptURL, title) {
  10. var xhr = new XMLHttpRequest();
  11. xhr.open('GET', scriptURL, true);
  12. xhr.onreadystatechange = function () {
  13. if (xhr.readyState === 4) {
  14. if (xhr.status === 200) {
  15. blockEditorChange = true;
  16. console.log(xhr.responseText);
  17. jsEditor.setValue(xhr.responseText);
  18. jsEditor.setPosition({ lineNumber: 0, column: 0 });
  19. blockEditorChange = false;
  20. compileAndRun();
  21. document.getElementById("currentScript").innerHTML = title;
  22. currentSnippetToken = null;
  23. }
  24. }
  25. };
  26. xhr.send(null);
  27. };
  28. var showError = function(error) {
  29. console.warn(error);
  30. };
  31. compileAndRun = function (code) {
  32. try {
  33. if (!BABYLON.Engine.isSupported()) {
  34. showError("Your browser does not support WebGL");
  35. return;
  36. }
  37. if (engine) {
  38. engine.dispose();
  39. engine = null;
  40. }
  41. var canvas = document.getElementById("renderCanvas");
  42. engine = new BABYLON.Engine(canvas, true, {stencil: true});
  43. BABYLON.Camera.ForceAttachControlToAlwaysPreventDefault = true;
  44. engine.runRenderLoop(function () {
  45. if (engine.scenes.length === 0) {
  46. return;
  47. }
  48. if (canvas.width !== canvas.clientWidth) {
  49. engine.resize();
  50. }
  51. var scene = engine.scenes[0];
  52. if (scene.activeCamera || scene.activeCameras.length > 0) {
  53. scene.render();
  54. }
  55. fpsLabel.innerHTML = engine.getFps().toFixed() + " fps";
  56. });
  57. var scene;
  58. if (code.indexOf("createScene") !== -1) { // createScene
  59. eval(code);
  60. scene = createScene();
  61. if (!scene) {
  62. showError("createScene function must return a scene.");
  63. return;
  64. }
  65. zipCode = code + "\r\n\r\nvar scene = createScene();";
  66. } else if (code.indexOf("CreateScene") !== -1) { // CreateScene
  67. eval(code);
  68. scene = CreateScene();
  69. if (!scene) {
  70. showError("CreateScene function must return a scene.");
  71. return;
  72. }
  73. zipCode = code + "\r\n\r\nvar scene = CreateScene();";
  74. } else if (code.indexOf("createscene") !== -1) { // createscene
  75. eval(code);
  76. scene = createscene();
  77. if (!scene) {
  78. showError("createscene function must return a scene.");
  79. return;
  80. }
  81. zipCode = code + "\r\n\r\nvar scene = createscene();";
  82. } else { // Direct code
  83. scene = new BABYLON.Scene(engine);
  84. eval("runScript = function(scene, canvas) {" + code + "}");
  85. runScript(scene, canvas);
  86. zipCode = "var scene = new BABYLON.Scene(engine);\r\n\r\n" + code;
  87. }
  88. } catch (e) {
  89. // showError(e.message);
  90. }
  91. };
  92. window.addEventListener("resize", function () {
  93. if (engine) {
  94. engine.resize();
  95. }
  96. });
  97. // UI
  98. var cleanHash = function () {
  99. var splits = decodeURIComponent(location.hash.substr(1)).split("#");
  100. if (splits.length > 2) {
  101. splits.splice(2, splits.length - 2);
  102. }
  103. location.hash = splits.join("#");
  104. };
  105. var checkHash = function () {
  106. if (location.hash) {
  107. cleanHash();
  108. try {
  109. var xmlHttp = new XMLHttpRequest();
  110. xmlHttp.onreadystatechange = function () {
  111. if (xmlHttp.readyState === 4) {
  112. if (xmlHttp.status === 200) {
  113. var snippetCode = JSON.parse(JSON.parse(xmlHttp.responseText)[0].jsonPayload).code;
  114. compileAndRun(snippetCode);
  115. document.getElementById("refresh").addEventListener("click", function () {
  116. compileAndRun(snippetCode);
  117. });
  118. }
  119. }
  120. };
  121. var hash = location.hash.substr(1);
  122. currentSnippetToken = hash.split("#")[0];
  123. if(!hash.split("#")[1]) hash += "#0";
  124. xmlHttp.open("GET", snippetUrl + "/" + hash.replace("#", "/"));
  125. xmlHttp.send();
  126. document.getElementById("link").href = "//www.babylonjs-playground.com/#" + hash;
  127. } catch (e) {
  128. }
  129. }
  130. };
  131. checkHash();
  132. })();