Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.81 KB | None | 0 0
  1. "use strict";
  2.  
  3. const VERTEX_SHADER_SOURCE = `
  4. attribute vec2 a_position;
  5.  
  6. uniform vec2 u_translation;
  7.  
  8. uniform float u_rotation; // radians
  9.  
  10. void main() {
  11. float x = a_position.x + u_translation.x + a_position.x * cos(u_rotation) - a_position.y * sin(u_rotation);
  12. float y = a_position.y + u_translation.y + a_position.x * sin(u_rotation)+ a_position.y * cos(u_rotation);
  13.  
  14. gl_Position = vec4(x, y, 1.0, 1.0);
  15. }
  16. `;
  17.  
  18. const FRAGMENT_SHADER_SOURCE = `
  19. precision mediump float;
  20. uniform vec4 u_FragColor;
  21. void main() {
  22. gl_FragColor = u_FragColor;
  23. }
  24. `;
  25.  
  26. const MOVE_SPEED = 0.5;
  27.  
  28. function main() {
  29. // Setup context
  30. const canvas = document.getElementById("c");
  31. const gl = canvas.getContext("webgl");
  32. if (gl === null) {
  33. window.alert("WebGL not supported!");
  34. return;
  35. }
  36.  
  37. // Setup shaders
  38. const vertexShader = createShader(gl, gl.VERTEX_SHADER, VERTEX_SHADER_SOURCE);
  39. const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SHADER_SOURCE);
  40. const program = createProgram(gl, vertexShader, fragmentShader);
  41. const positionAttributeLocation = gl.getAttribLocation(program, "a_position");
  42. gl.enableVertexAttribArray(positionAttributeLocation);
  43. gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT,false, 0, 0);
  44.  
  45. const rotationUniform = gl.getUniformLocation(program,"u_rotation");
  46. const translationUniformLocation = gl.getUniformLocation(program, "u_translation");
  47. const colourUniform = gl.getUniformLocation(program, "u_FragColor");
  48. gl.useProgram(program);
  49.  
  50. let translationX = 0.0;
  51. let translationY = 0.0;
  52.  
  53. let oldTime = 0;
  54. let angle = 0;
  55.  
  56. let leftPresed = false;
  57. let rightPressed = false;
  58. let downPressed = false;
  59. let upPressed = false;
  60.  
  61. // User input ( created here, because input.js didnt work)
  62. {
  63. document.addEventListener("keydown", function (event) {
  64. switch (event.key) {
  65. case "a": {
  66. leftPresed = true;
  67. }
  68. break;
  69.  
  70. case "d": {
  71. rightPressed = true;
  72. }
  73. break;
  74.  
  75. case "s": {
  76. downPressed = true;
  77. }
  78. break;
  79.  
  80. case "w": {
  81. upPressed = true;
  82. }
  83. break;
  84. }
  85. });
  86.  
  87. document.addEventListener("keyup", function (event) {
  88. switch (event.key) {
  89. case "a": {
  90. leftPresed = false;
  91. }
  92. break;
  93.  
  94. case "d": {
  95. rightPressed = false;
  96. }
  97. break;
  98.  
  99. case "s": {
  100. downPressed = false;
  101. }
  102. break;
  103.  
  104. case "w": {
  105. upPressed = false;
  106. }
  107. break;
  108. }
  109. });
  110.  
  111. }
  112.  
  113. // Setup vertex position buffer
  114. const positions = [
  115. -0.8, 0.8,-0.65, 0.6, -0.8, 0.6, // building_1_1
  116. -0.8, 0.8,-0.65, 0.6, -0.65, 0.8, // building_1_2
  117.  
  118. 0.1, 1.0, 0.5, 1.0, 0.3, -1.0, //first half of river
  119. 0.3, -1.0,0.5, 1.0, 0.7, -1.0, //second half
  120.  
  121. -0.6, 0.5, -0.83, 0.3, -0.83, 0.5, //building_2_1
  122. -0.6, 0.5, -0.83, 0.3, -0.6, 0.3, // building_2_2
  123.  
  124. 0.75, 0.95, 0.95, 0.77, 0.95, 0.95, //building_3_1
  125. 0.75, 0.95, 0.95, 0.77, 0.75, 0.77, // building_3_2
  126.  
  127. 0.8, 0.7, 0.95, 0.7, 0.95, 0.45, //helipad_1
  128. 0.8, 0.7, 0.95, 0.45, 0.8, 0.45, //helipad_2
  129.  
  130. 0.84, 0.65, 0.86, 0.65, 0.86, 0.5,//
  131. 0.84, 0.65, 0.86, 0.5, 0.84, 0.5,//
  132. 0.89, 0.65, 0.91, 0.65, 0.91, 0.5,//
  133. 0.89, 0.65, 0.91, 0.5, 0.89, 0.5,//helipad
  134. 0.86, 0.59, 0.86, 0.54, 0.89, 0.59,//
  135. 0.86, 0.54, 0.89, 0.54, 0.89, 0.59,//
  136.  
  137. // helicopter
  138. -0.1, 0.5, 0.1, 0.5, 0.03, 0.58,// front
  139. -0.1, 0.5, 0.03, 0.58, -0.03, 0.58,// end front
  140. -0.1, 0.5, 0.1, 0.5, -0.1, 0.1,// mid-square
  141. -0.1, 0.1, 0.1, 0.5, 0.1, 0.1,// square end
  142. 0.1, 0.1, -0.1, 0.1, 0, 0,
  143. 0.02, 0.02, -0.02, 0.02, -0.02, -0.3, //tail
  144. -0.02, -0.3, 0.02, 0.02, 0.02, -0.3,
  145. -0.02, -0.3, 0.02, 0.02, 0.02, -0.3,
  146. -0.02, -0.3, -0.02, -0.26, -0.05, -0.3, //
  147. 0, 0.3, 0.3, 0.3, 0.3, 0.35, //blades
  148. 0, 0.3, -0.3, 0.3, -0.3, 0.35
  149. ];
  150. const positionBuffer = gl.createBuffer();
  151. gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
  152. gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
  153.  
  154. // Prepare position buffer
  155. {
  156. const size = 2; // 2 components per iteration
  157. const type = gl.FLOAT; // the data is 32bit floats
  158. const normalize = false; // don't normalize the data
  159. const stride = 0; // 0 = move forward size * sizeof(type) each iteration to get the next position
  160. const offset = 0; // start at the beginning of the buffer
  161. gl.vertexAttribPointer(positionAttributeLocation, size, type, normalize, stride, offset);
  162. gl.enableVertexAttribArray(positionAttributeLocation);
  163. }
  164.  
  165. gl.clearColor(0, 0.59, 0.25, 1);
  166.  
  167. const render = function () {
  168. resizeCanvas(canvas);
  169. gl.viewport(0, 0, canvas.width, canvas.height);
  170.  
  171. gl.clear(gl.COLOR_BUFFER_BIT);
  172.  
  173. gl.uniform2fv(translationUniformLocation, [0, 0]);
  174. gl.uniform4fv(colourUniform, [0.6,0.3,0,1]);
  175. gl.drawArrays(gl.TRIANGLES, 0, 6);
  176. gl.drawArrays(gl.TRIANGLES, 12, 6);
  177. gl.drawArrays(gl.TRIANGLES, 18, 6);
  178.  
  179.  
  180. gl.uniform4fv(colourUniform, [0.4,0.7,1,1]);
  181. gl.drawArrays(gl.TRIANGLES, 6, 6);
  182.  
  183. gl.uniform4fv(colourUniform, [0,0,0,1]);
  184. gl.drawArrays(gl.TRIANGLES, 24, 6);
  185. gl.drawArrays(gl.LINE_LOOP, 0, 6);
  186. gl.drawArrays(gl.LINE_LOOP, 12, 6);
  187. gl.drawArrays(gl.LINE_LOOP, 18, 6);
  188.  
  189.  
  190. gl.uniform4fv(colourUniform, [1,1,1,1]);
  191. gl.drawArrays(gl.TRIANGLES, 30, 18);
  192. // Draw the triangle
  193. {
  194.  
  195. gl.uniform2fv(translationUniformLocation, [translationX, translationY]);
  196. gl.uniform4fv(colourUniform, [0,0,0,0.8]);
  197. gl.drawArrays(gl.TRIANGLES, 48, 27);
  198. }
  199.  
  200. {
  201. gl.uniform1f(rotationUniform, angle);
  202. //draw
  203. gl.drawArrays(gl.TRIANGLES, 75, 3);
  204. }
  205.  
  206. };
  207.  
  208. let lastSeconds = 0;
  209.  
  210. angle = 0; // degrees
  211. const turnSpeed = 1; // degree per second
  212. let update = function(deltaTime) {
  213. angle += turnSpeed * deltaTime;
  214. };
  215.  
  216. let oldtime = 0;
  217.  
  218. let animate = function (milliseconds) {
  219.  
  220. const seconds = milliseconds / 1000;
  221. const delta = seconds - lastSeconds;
  222.  
  223. render();
  224. window.requestAnimationFrame(animate);
  225.  
  226. if (leftPresed) {
  227. translationX -= MOVE_SPEED * delta;
  228. update(delta);
  229. }
  230. if (rightPressed) {
  231. translationX += MOVE_SPEED * delta;
  232. }
  233. if (downPressed) {
  234. translationY -= MOVE_SPEED * delta;
  235. }
  236. if (upPressed) {
  237. translationY += MOVE_SPEED * delta;
  238. }
  239.  
  240. lastSeconds = seconds;
  241. };
  242.  
  243. animate();
  244. }
  245.  
  246. function resizeCanvas (canvas) {
  247. check(isCanvas(canvas));
  248.  
  249. const cssToRealPixels = window.devicePixelRatio || 1.0;
  250.  
  251. const displayWidth = Math.floor(canvas.clientWidth * cssToRealPixels);
  252. const displayHeight = Math.floor(canvas.clientHeight * cssToRealPixels);
  253.  
  254. if (canvas.width !== displayWidth || canvas.height !== displayHeight) {
  255. canvas.width = canvas.clientWidth;
  256. canvas.height = canvas.clientHeight;
  257. return true;
  258. }
  259. else {
  260. return false;
  261. }
  262. }
  263.  
  264. function createShader (gl, type, source) {
  265. check(isContext(gl), isString(source));
  266.  
  267. const shader = gl.createShader(type);
  268. gl.shaderSource(shader, source);
  269. gl.compileShader(shader);
  270. const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
  271. if (!success) {
  272. console.error(gl.getShaderInfoLog(shader));
  273. gl.deleteShader(shader);
  274. return null;
  275. }
  276.  
  277. return shader;
  278. }
  279.  
  280. function createProgram (gl, vertexShader, fragmentShader) {
  281. check(isContext(gl), isShader(vertexShader), isShader(fragmentShader));
  282.  
  283. const program = gl.createProgram();
  284. gl.attachShader(program, vertexShader);
  285. gl.attachShader(program, fragmentShader);
  286. gl.linkProgram(program);
  287.  
  288. const success = gl.getProgramParameter(program, gl.LINK_STATUS);
  289. if (!success) {
  290. console.error(gl.getProgramInfoLog(program));
  291. gl.deleteProgram(program);
  292. return null;
  293. }
  294.  
  295. return program;
  296. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement