index.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. var onload = function () {
  2. var canvas = document.getElementById("renderCanvas");
  3. var divFps = document.getElementById("fps");
  4. var mode = "CAMERA";
  5. if (!BABYLON.Engine.isSupported()) {
  6. document.getElementById("notSupported").className = "";
  7. return;
  8. }
  9. // Babylon
  10. BABYLON.Engine.ShadersRepository = "";
  11. var engine = new BABYLON.Engine(canvas, true);
  12. var scene = new BABYLON.Scene(engine);
  13. var camera = new BABYLON.ArcRotateCamera("Camera", 0, 0, 10, BABYLON.Vector3.Zero(), scene);
  14. var sun = new BABYLON.PointLight("Omni", new BABYLON.Vector3(20, 100, 2), scene);
  15. camera.setPosition(new BABYLON.Vector3(20, 40, 20));
  16. camera.attachControl(canvas);
  17. // Skybox
  18. var skybox = BABYLON.Mesh.CreateBox("skyBox", 1000.0, scene);
  19. var skyboxMaterial = new BABYLON.StandardMaterial("skyBox", scene);
  20. skyboxMaterial.backFaceCulling = false;
  21. skyboxMaterial.reflectionTexture = new BABYLON.CubeTexture("Assets/skybox/skybox", scene);
  22. skyboxMaterial.reflectionTexture.coordinatesMode = BABYLON.Texture.SKYBOX_MODE;
  23. skyboxMaterial.diffuseColor = new BABYLON.Color3(0, 0, 0);
  24. skyboxMaterial.specularColor = new BABYLON.Color3(0, 0, 0);
  25. skybox.material = skyboxMaterial;
  26. // Grounds
  27. var ground = BABYLON.Mesh.CreateGroundFromHeightMap("ground", "Assets/heightMap.png", 100, 100, 100, 0, 12, scene, true);
  28. var groundMaterial = new WORLDMONGER.GroundMaterial("ground", scene, sun);
  29. ground.material = groundMaterial;
  30. ground.position.y = -2.0;
  31. var extraGround = BABYLON.Mesh.CreateGround("extraGround", 1000, 1000, 1, scene, false);
  32. var extraGroundMaterial = new BABYLON.StandardMaterial("extraGround", scene);
  33. extraGroundMaterial.diffuseTexture = new BABYLON.Texture("Shaders/Ground/sand.jpg", scene);
  34. extraGroundMaterial.diffuseTexture.uScale = 60;
  35. extraGroundMaterial.diffuseTexture.vScale = 60;
  36. extraGround.position.y = -2.05;
  37. extraGround.material = extraGroundMaterial;
  38. // Water
  39. var water = BABYLON.Mesh.CreateGround("water", 1000, 1000, 1, scene, false);
  40. var waterMaterial = new WORLDMONGER.WaterMaterial("water", scene, sun);
  41. waterMaterial.refractionTexture.renderList.push(ground);
  42. waterMaterial.refractionTexture.renderList.push(extraGround);
  43. waterMaterial.reflectionTexture.renderList.push(ground);
  44. waterMaterial.reflectionTexture.renderList.push(skybox);
  45. water.isPickable = false;
  46. water.material = waterMaterial;
  47. // Elevation
  48. var elevationControl = new WORLDMONGER.ElevationControl(ground);
  49. // Render loop
  50. var renderFunction = function () {
  51. if (ground.isReady && ground.subMeshes.length == 1) {
  52. ground.subdivide(20); // Subdivide to optimize picking
  53. }
  54. // Camera
  55. if (camera.beta < 0.1)
  56. camera.beta = 0.1;
  57. else if (camera.beta > (Math.PI / 2) * 0.92)
  58. camera.beta = (Math.PI / 2) * 0.92;
  59. if (camera.radius > 70)
  60. camera.radius = 70;
  61. if (camera.radius < 5)
  62. camera.radius = 5;
  63. // Fps
  64. divFps.innerHTML = BABYLON.Tools.GetFps().toFixed() + " fps";
  65. // Render scene
  66. scene.render();
  67. // Animations
  68. skybox.rotation.y += 0.0001 * scene.getAnimationRatio();
  69. };
  70. // Launch render loop
  71. engine.runRenderLoop(renderFunction);
  72. // Resize
  73. window.addEventListener("resize", function () {
  74. engine.resize();
  75. });
  76. // UI
  77. var cameraButton = document.getElementById("cameraButton");
  78. var elevationButton = document.getElementById("elevationButton");
  79. var digButton = document.getElementById("digButton");
  80. var help01 = document.getElementById("help01");
  81. var help02 = document.getElementById("help02");
  82. window.oncontextmenu = function () {
  83. return false;
  84. };
  85. cameraButton.addEventListener("pointerdown", function () {
  86. if (mode == "CAMERA")
  87. return;
  88. camera.attachControl(canvas);
  89. elevationControl.detachControl(canvas);
  90. mode = "CAMERA";
  91. cameraButton.className = "controlButton selected";
  92. digButton.className = "controlButton";
  93. elevationButton.className = "controlButton";
  94. });
  95. elevationButton.addEventListener("pointerdown", function () {
  96. help01.className = "help";
  97. help02.className = "help";
  98. if (mode == "ELEVATION")
  99. return;
  100. if (mode == "CAMERA") {
  101. camera.detachControl(canvas);
  102. elevationControl.attachControl(canvas);
  103. }
  104. mode = "ELEVATION";
  105. elevationControl.direction = 1;
  106. elevationButton.className = "controlButton selected";
  107. digButton.className = "controlButton";
  108. cameraButton.className = "controlButton";
  109. });
  110. digButton.addEventListener("pointerdown", function () {
  111. help01.className = "help";
  112. help02.className = "help";
  113. if (mode == "DIG")
  114. return;
  115. if (mode == "CAMERA") {
  116. camera.detachControl(canvas);
  117. elevationControl.attachControl(canvas);
  118. }
  119. mode = "DIG";
  120. elevationControl.direction = -1;
  121. digButton.className = "controlButton selected";
  122. elevationButton.className = "controlButton";
  123. cameraButton.className = "controlButton";
  124. });
  125. // Sliders
  126. $("#slider-vertical").slider({
  127. orientation: "vertical",
  128. range: "min",
  129. min: 2,
  130. max: 15,
  131. value: 5,
  132. slide: function (event, ui) {
  133. elevationControl.radius = ui.value;
  134. }
  135. });
  136. $("#slider-range").slider({
  137. orientation: "vertical",
  138. range: true,
  139. min: 0,
  140. max: 12,
  141. values: [0, 11],
  142. slide: function (event, ui) {
  143. elevationControl.heightMin = ui.values[0];
  144. elevationControl.heightMax = ui.values[1];
  145. }
  146. });
  147. $("#qualitySlider").slider({
  148. orientation: "vertical",
  149. range: "min",
  150. min: 0,
  151. max: 3,
  152. value: 3,
  153. slide: function (event, ui) {
  154. switch (ui.value) {
  155. case 3:
  156. waterMaterial.refractionTexture.resize(512, true);
  157. waterMaterial.reflectionTexture.resize(512, true);
  158. scene.getEngine().setHardwareScalingLevel(1);
  159. scene.particlesEnabled = true;
  160. break;
  161. case 2:
  162. waterMaterial.refractionTexture.resize(256, true);
  163. waterMaterial.reflectionTexture.resize(256, true);
  164. scene.getEngine().setHardwareScalingLevel(1);
  165. scene.particlesEnabled = false;
  166. break;
  167. case 1:
  168. waterMaterial.refractionTexture.resize(256, true);
  169. waterMaterial.reflectionTexture.resize(256, true);
  170. scene.getEngine().setHardwareScalingLevel(2);
  171. scene.particlesEnabled = false;
  172. break;
  173. case 0:
  174. waterMaterial.refractionTexture.resize(256, true);
  175. waterMaterial.reflectionTexture.resize(256, true);
  176. scene.getEngine().setHardwareScalingLevel(3);
  177. scene.particlesEnabled = false;
  178. break;
  179. }
  180. }
  181. });
  182. help01.className = "help shown";
  183. setTimeout(function() {
  184. help01.className = "help";
  185. help02.className = "help shown";
  186. setTimeout(function() {
  187. help02.className = "help";
  188. }, 5000);
  189. }, 5000);
  190. };