index.js 7.6 KB

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