index.html 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. <!doctype html>
  2. <html>
  3. <head>
  4. <title>###TITLE###</title>
  5. <style>
  6. html, body {
  7. width: 100%;
  8. height: 100%;
  9. min-height:100%;
  10. padding: 0;
  11. margin: 0;
  12. overflow: hidden;
  13. position: fixed;
  14. font-family: "Segoe UI", "Segoe WP", "Verdana", "Arial";
  15. background-color: #000000;
  16. }
  17. button {
  18. cursor: hand;
  19. border: 1px solid #888888;
  20. background-color: #DEDEDE;
  21. color: #888888;
  22. }
  23. button:focus {
  24. outline: none;
  25. }
  26. button:hover {
  27. background-color: #EEEEEE;
  28. }
  29. button:active {
  30. transform: scale(0.98);
  31. -webkit-transform: scale(0.98);
  32. }
  33. .warning {
  34. color: red;
  35. }
  36. .hidden {
  37. display: none;
  38. }
  39. .tag {
  40. position: absolute;
  41. height: 34px;
  42. width: 160px;
  43. left: 50%;
  44. padding: 6px;
  45. font-size: 14px;
  46. text-align: center;
  47. margin-left: -80px;
  48. top: -34px;
  49. border-top-left-radius: 6px 6px;
  50. border-top-right-radius: 6px 6px;
  51. background-color: #EEEEEE;
  52. color: #888888;
  53. }
  54. #cvs {
  55. width: 100%;
  56. height: 100%;
  57. padding: 0;
  58. opacity: 0;
  59. z-index: 0;
  60. outline: none;
  61. touch-action: none;
  62. -ms-touch-action: none;
  63. background-color: #000000;
  64. }
  65. #gui {
  66. width: 100%;
  67. height: 100%;
  68. min-height:100%;
  69. z-index: 1;
  70. outline: none;
  71. background-color: transparent;
  72. }
  73. #sts {
  74. position: absolute;
  75. left: 20px;
  76. bottom: 20px;
  77. font-size: 14px;
  78. z-index: 2;
  79. color: white;
  80. text-shadow: 2px 2px 0 black;
  81. }
  82. #fps {
  83. position: absolute;
  84. right: 20px;
  85. top: 1em;
  86. z-index: 2;
  87. font-size: 18px;
  88. color: white;
  89. text-shadow: 2px 2px 0 black;
  90. }
  91. #project {
  92. position: absolute;
  93. left: 20px;
  94. top: 1em;
  95. z-index: 2;
  96. font-size: 18px;
  97. color: white;
  98. text-shadow: 2px 2px 0 black;
  99. }
  100. #controlPanel {
  101. position: absolute;
  102. height: 100px;
  103. bottom: 0px;
  104. width: 220px;
  105. left: 50%;
  106. margin-left: -120px;
  107. z-index: 2;
  108. transition: transform 0.25s ease-in-out;
  109. transform: translateY(100px);
  110. -webkit-transition: -webkit-transform 0.25s ease-in-out;
  111. -webkit-transform: translateY(100px);
  112. }
  113. #clickableTag {
  114. cursor: hand;
  115. background-color: transparent;
  116. }
  117. #controlsZone {
  118. width: 100%;
  119. height: 100%;
  120. background-color: #EEEEEE;
  121. color: #888888;
  122. border-top-left-radius: 6px 6px;
  123. border-top-right-radius: 6px 6px;
  124. padding: 6px;
  125. }
  126. #togglePause {
  127. width: 24px;
  128. }
  129. #frameStep {
  130. width: 28px;
  131. }
  132. #enableDebug, #fullscreen {
  133. width: 160px;
  134. margin-left: 30px;
  135. }
  136. </style>
  137. </head>
  138. <body>
  139. <canvas id="cvs"></canvas>
  140. <div id="sts">Please wait...</div>
  141. <div id="gui" class="hidden"></div>
  142. <div id="fps" class="hidden"></div>
  143. <div id="project" class="hidden"></div>
  144. <div id="controlPanel" class="hidden">
  145. <div id="controlsZone">
  146. <p>
  147. <button id="enableDebug">Debug Layer</button>
  148. </p>
  149. <p>
  150. <button id="fullscreen">Full Screen</button>
  151. </p>
  152. </div>
  153. <div class="tag" id="controlTab" >
  154. <button id="togglePause">||</button>
  155. <button id="clickableTag">Control Panel</button>
  156. <button id="frameStep">>></button>
  157. </div>
  158. </div>
  159. <script type="text/javascript" src="###SCRIPT###/hand.js"></script>
  160. <script type="text/javascript" src="###SCRIPT###/oimo.js"></script>
  161. <script type="text/javascript" src="###SCRIPT###/cannon.js"></script>
  162. <script type="text/javascript" src="###SCRIPT###/babylon.js"></script>
  163. <script type="text/javascript" src="###SCRIPT###/canvas2d.js"></script>
  164. <script type="text/javascript" src="###SCRIPT###/navmesh.js"></script>
  165. <script type="text/javascript" src="###SCRIPT###/manager.js"></script>
  166. <script type="text/javascript" src="###PATH###/###PROJECT###.js"></script>
  167. <script type="text/javascript">
  168. var clickableTag = document.getElementById("clickableTag");
  169. var controlsZone = document.getElementById("controlsZone");
  170. var controlPanel = document.getElementById("controlPanel");
  171. var togglePause = document.getElementById("togglePause");
  172. var enableDebug = document.getElementById("enableDebug");
  173. var fullscreen = document.getElementById("fullscreen");
  174. var frameStep = document.getElementById("frameStep");
  175. var project = document.getElementById("project");
  176. var canvas = document.getElementById("cvs");
  177. var divgui = document.getElementById("gui");
  178. var divfps = document.getElementById("fps");
  179. var divsts = document.getElementById("sts");
  180. var folder = "###PATH###/";
  181. var title = "###TITLE###";
  182. var controls = ###DEBUG###;
  183. var paused = false;
  184. var loaded = false;
  185. var scene = null;
  186. var last = -1;
  187. // Start project scene loader
  188. var engine = new BABYLON.Engine(canvas, true);
  189. engine.clear(new BABYLON.Color3(0.0,0.0,0.0), true, true);
  190. var loadBabylonScene = function(root, name) {
  191. last = -1;
  192. scene = null;
  193. loaded = false;
  194. paused = false;
  195. project.innerHTML = "";
  196. divfps.innerHTML = "";
  197. divgui.innerHTML = "";
  198. divsts.innerHTML = "";
  199. divsts.className = "";
  200. project.className = "hidden";
  201. divfps.className = "hidden";
  202. divgui.className = "hidden";
  203. controlPanel.className = "hidden";
  204. canvas.style.opacity = "0";
  205. engine.clear(new BABYLON.Color3(0.0,0.0,0.0), true, true);
  206. BABYLON.SceneLoader.ShowLoadingScreen = false;
  207. engine.loadingUIText = title;
  208. engine.displayLoadingUI();
  209. project.innerHTML = name;
  210. togglePause.style.backgroundColor = "#DEDEDE";
  211. divsts.innerHTML = "Streaming items...";
  212. setTimeout(function(){ executeSceneLoader(root, name); }, 1000);
  213. };
  214. var progressSceneLoader = function() {
  215. if (engine && scene) {
  216. if (!loaded) {
  217. var waiting = scene.getWaitingItemsCount();
  218. divsts.innerHTML = (waiting > 0) ? "Streaming items..." + waiting + " remaining" : "Loading scene...";
  219. setTimeout(progressSceneLoader, 100);
  220. }
  221. }
  222. };
  223. var executeSceneLoader = function(root, name) {
  224. BABYLON.SceneManager.LoadScene(root, name, engine, function (newscene) {
  225. scene = newscene;
  226. progressSceneLoader();
  227. scene.executeWhenReady(function () {
  228. loaded = true;
  229. startRenderLoop();
  230. engine.hideLoadingUI();
  231. BABYLON.SceneLoader.ShowLoadingScreen = true;
  232. canvas.style.opacity = "1";
  233. divsts.className = "hidden";
  234. project.className = "";
  235. divfps.className = "";
  236. divgui.className = "";
  237. controlPanel.className = "";
  238. });
  239. });
  240. };
  241. // Register scene loader (load-level)
  242. BABYLON.SceneManager.RegisterLoader(loadBabylonScene);
  243. window.addEventListener("DOMContentLoaded", function () {
  244. loadBabylonScene(folder, "###SCENE###");
  245. });
  246. // Developer page render loop function
  247. var renderFunction = function () {
  248. if (engine && scene) {
  249. if (controls) {
  250. // Show
  251. if (project.className === "hidden") {
  252. project.className = "";
  253. console.log("Showing debug project label...");
  254. }
  255. if (divfps.className === "hidden") {
  256. divfps.className = "";
  257. console.log("Showing debug fps status...");
  258. }
  259. if (controlPanel.className === "hidden") {
  260. controlPanel.className = "";
  261. console.log("Showing debug control panel...");
  262. }
  263. var current = engine.getFps().toFixed();
  264. if (current != last) {
  265. divfps.innerHTML = ("" + current + " fps");
  266. last = current;
  267. }
  268. } else {
  269. // Hide
  270. if (project.className !== "hidden") {
  271. project.className = "hidden";
  272. console.log("Hiding debug project label...");
  273. }
  274. if (divfps.className !== "hidden") {
  275. divfps.className = "hidden";
  276. console.log("Hiding debug fps status...");
  277. }
  278. if (controlPanel.className !== "hidden") {
  279. controlPanel.className = "hidden";
  280. console.log("Hiding debug control panel...");
  281. }
  282. if (divfps.innerHTML !== "") {
  283. divfps.innerHTML = "";
  284. }
  285. }
  286. }
  287. };
  288. // Start managed render loop
  289. var startRenderLoop = function() {
  290. if (scene.manager) {
  291. scene.manager.onrender = renderFunction;
  292. scene.manager.start();
  293. } else {
  294. console.log("Index.html: Null scene manager detected.");
  295. }
  296. };
  297. // Stop managed render loop
  298. var stopRenderLoop = function() {
  299. if (scene.manager) {
  300. scene.manager.stop();
  301. } else {
  302. console.log("Index.html: Null scene manager detected.");
  303. }
  304. };
  305. // Toggle managed render loop
  306. var toggleRenderLoop = function() {
  307. if (scene.manager) {
  308. scene.manager.toggle();
  309. paused = !scene.manager.isRunning();
  310. if (paused) {
  311. togglePause.style.backgroundColor = "#800000";
  312. } else {
  313. togglePause.style.backgroundColor = "#DEDEDE";
  314. }
  315. } else {
  316. console.log("Index.html: Null scene manager detected.");
  317. }
  318. };
  319. // Step managed render loop
  320. var stepRenderLoop = function() {
  321. if (scene.manager) {
  322. scene.manager.stepFrame();
  323. var running = scene.manager.isRunning();
  324. if (!running) {
  325. frameStep.style.backgroundColor = "#008000";
  326. setTimeout(function(){ frameStep.style.backgroundColor = "#DEDEDE"; }, 25);
  327. }
  328. if (!running) {
  329. togglePause.style.backgroundColor = "#800000";
  330. } else {
  331. togglePause.style.backgroundColor = "#DEDEDE";
  332. }
  333. } else {
  334. console.log("Index.html: Null scene manager detected.");
  335. }
  336. };
  337. // Show window fullscreen
  338. var showFullscreen = function() {
  339. if (scene.manager) {
  340. scene.manager.showFullscreen();
  341. } else {
  342. console.log("Index.html: Null scene manager detected.");
  343. }
  344. };
  345. // Toggle debug layer
  346. var toggleDebugLayer = function() {
  347. if (scene.manager) {
  348. scene.manager.toggleDebug();
  349. } else {
  350. console.log("Index.html: Null scene manager detected.");
  351. }
  352. };
  353. // Toggle scene pause
  354. if (togglePause) {
  355. togglePause.addEventListener("click", function () {
  356. toggleRenderLoop();
  357. });
  358. };
  359. // Frame step scene
  360. if (frameStep) {
  361. frameStep.addEventListener("click", function () {
  362. stepRenderLoop();
  363. });
  364. };
  365. // Toggle control panel
  366. var panelIsClosed = true;
  367. if (clickableTag) {
  368. clickableTag.addEventListener("click", function () {
  369. if (panelIsClosed) {
  370. panelIsClosed = false;
  371. controlPanel.style.webkitTransform = "translateY(0px)";
  372. controlPanel.style.transform = "translateY(0px)";
  373. } else {
  374. panelIsClosed = true;
  375. controlPanel.style.webkitTransform = "translateY(100px)";
  376. controlPanel.style.transform = "translateY(100px)";
  377. }
  378. });
  379. };
  380. // Show debug layer
  381. if (enableDebug) {
  382. enableDebug.addEventListener("click", function () {
  383. toggleDebugLayer();
  384. });
  385. };
  386. // Switch full screen
  387. if (fullscreen) {
  388. fullscreen.addEventListener("click", function () {
  389. showFullscreen();
  390. });
  391. };
  392. // Resize window handler
  393. if (engine) {
  394. window.addEventListener("resize", function () {
  395. engine.resize();
  396. });
  397. }
  398. </script>
  399. </body>
  400. </html>