Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.27 KB | None | 0 0
  1. "use strict";
  2.  
  3. const vertexShaderSource =`
  4. attribute vec2 a_position;
  5.  
  6. uniform vec2 u_translation;
  7.  
  8. void main(){
  9. gl_Position = vec4(a_position + u_translation, 0.0, 1.0);
  10. }
  11. `;
  12.  
  13. const fragmentShaderSource = `
  14. precision mediump float;
  15. uniform vec4 u_FragColor;
  16. void main(){
  17. gl_FragColor = u_FragColor;
  18. }
  19. `;
  20.  
  21. const MOVE_SPEED = 0.5;
  22.  
  23. function main() {
  24.  
  25. const canvas = document.getElementById("c");
  26. const gl = canvas.getContext("webgl");
  27. if(gl === null){
  28. window.alert("WebGl not suppoted!");
  29. return;
  30. }
  31.  
  32. // INITIALISATION CODE GOES HERE
  33.  
  34. // === Per Frame operations ===
  35.  
  36. let update = function(deltaTime) {
  37. // YOUR UPDATE FUNCTION
  38. };
  39.  
  40. /*let render = function() {
  41. // YOUR RENDER FUNCTION
  42. resizeCanvas(c);
  43. gl.viewport(0, 0, c.width, c.height);
  44.  
  45. gl.clear(gl.COLOR_BUFFER_BIT);
  46.  
  47. // Draw the triangle
  48. {
  49. const primitiveType = gl.TRIANGLES;
  50. const offset = 0;
  51. const count = 3;
  52. gl.drawArrays(primitiveType, offset, count);
  53. }
  54. };*/
  55.  
  56. // Setup shaders
  57. const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexShaderSource);
  58. const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);
  59. const program = createProgram(gl, vertexShader, fragmentShader);
  60. const positionAttributeLocation = gl.getAttribLocation(program, "a_position");
  61. const color = gl.getUniformLocation(program, "u_FragColor");
  62. //
  63. const translationUniformLocation = gl.getUniformLocation(program, "u_translation");
  64. gl.useProgram(program);
  65.  
  66. let translationX = 0.0;
  67. let translationY = 0.0;
  68.  
  69. let leftPresed = false;
  70. let rightPressed = false;
  71. let downPressed = false;
  72. let upPressed = false;
  73.  
  74. // User input
  75. {
  76. document.addEventListener("keydown", function (event) {
  77. switch (event.key) {
  78. case "ArrowLeft": {
  79. leftPresed = true;
  80. }
  81. break;
  82.  
  83. case "ArrowRight": {
  84. rightPressed = true;
  85. }
  86. break;
  87.  
  88. case "ArrowDown": {
  89. downPressed = true;
  90. }
  91. break;
  92.  
  93. case "ArrowUp": {
  94. upPressed = true;
  95. }
  96. break;
  97. }
  98. });
  99.  
  100. document.addEventListener("keyup", function (event) {
  101. switch (event.key) {
  102. case "ArrowLeft": {
  103. leftPresed = false;
  104. }
  105. break;
  106.  
  107. case "ArrowRight": {
  108. rightPressed = false;
  109. }
  110. break;
  111.  
  112. case "ArrowDown": {
  113. downPressed = false;
  114. }
  115. break;
  116.  
  117. case "ArrowUp": {
  118. upPressed = false;
  119. }
  120. break;
  121. }
  122. });
  123.  
  124. }
  125.  
  126. // Setup vertex position buffer
  127. const positions = [
  128. /*//helicoptor
  129. 1.0, 0.0,
  130. 0.0, 0.0,
  131. 1.0, 1.0,*/
  132. //river
  133. -0.4, 1.0,
  134. 0.0, 1.0,
  135. -0.4, -1.0,
  136. -0.4, 1.0,
  137. -0.4,-1.0,
  138. -0.8, -1.0,
  139. //house1
  140. 0.2, 0.9,
  141. 0.4, 0.9,
  142. 0.4, 0.7,
  143. 0.2, 0.9,
  144. 0.2, 0.7,
  145. 0.4, 0.7,
  146. //house2
  147. 0.7, -0.1,
  148. 0.9, -0.1,
  149. 0.9, -0.3,
  150. 0.7, -0.3,
  151. 0.9, -0.3,
  152. 0.7, -0.1,
  153.  
  154. //house3
  155. 0.8, 0.7,
  156. 0.9, 0.3,
  157. 1.0, 0.4,
  158. 0.9, 0.8,
  159. 0.8, 0.7,
  160. 1.0, 0.4,
  161.  
  162. //hellipad
  163. 0.1, -0.1,
  164. 0.5, -0.1,
  165. 0.5, -0.5,
  166. 0.1, -0.1,
  167. 0.1, -0.5,
  168. 0.5, -0.5,
  169.  
  170. //helipad "H"
  171. 0.2, -0.2,
  172. 0.4, -0.2,
  173. 0.4, -0.4,
  174. 0.2, -0.2,
  175. 0.2, -0.4,
  176. 0.4, -0.4,
  177.  
  178. //h top
  179. 0.25, -0.2,
  180. 0.35, -0.2,
  181. 0.35, -0.25,
  182. 0.25, -0.2,
  183. 0.25, -0.25,
  184. 0.35, -0.25,
  185.  
  186. ];
  187. const positionBuffer = gl.createBuffer();
  188. gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
  189. gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
  190.  
  191. // Prepare the screen for drawing
  192. gl.viewport(0, 0, canvas.width, canvas.height);
  193. gl.clearColor(0.0, 0.9, 0.4, 1.0);
  194. gl.clear(gl.COLOR_BUFFER_BIT);
  195.  
  196. // Specify which shader to use
  197. gl.useProgram(program);
  198.  
  199. // Prepare position buffer
  200. {
  201. const size = 2; // 2 components per iteration
  202. const type = gl.FLOAT; // the data is 32bit floats
  203. const normalize = false; // don't normalize the data
  204. const stride = 0; // 0 = move forward size * sizeof(type) each iteration to get the next position
  205. const offset = 0; // start at the beginning of the buffer
  206. gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
  207. gl.vertexAttribPointer(positionAttributeLocation, size, type, normalize, stride, offset);
  208. gl.enableVertexAttribArray(positionAttributeLocation);
  209. }
  210.  
  211. const render = function () {
  212. resizeCanvas(c);
  213. gl.viewport(0, 0, c.width, c.height);
  214.  
  215. gl.clear(gl.COLOR_BUFFER_BIT);
  216.  
  217.  
  218.  
  219. // Draw the triangle
  220. {
  221.  
  222. gl.uniform2fv(translationUniformLocation, [0, 0]);
  223. //river
  224. gl.uniform4fv(color, [0,0,1,1]);
  225. gl.drawArrays(gl.TRIANGLES, 0, 6);
  226.  
  227. gl.uniform4fv(color, [210/255,105/255,30/255,1]);
  228. //house1
  229. gl.drawArrays(gl.TRIANGLES, 6, 6);
  230. //house2
  231. gl.drawArrays(gl.TRIANGLES, 12, 6);
  232. //house3
  233. gl.drawArrays(gl.TRIANGLES, 18, 6);
  234. //hellipad
  235. gl.uniform4fv(color, [0,0,0,1]);
  236. gl.drawArrays(gl.TRIANGLES, 24, 6);
  237.  
  238. //hellipad
  239. gl.uniform4fv(color, [1,1,1,1]);
  240. gl.drawArrays(gl.TRIANGLES, 30, 6);
  241.  
  242. //H top
  243. gl.uniform4fv(color, [0,0,0,1]);
  244. gl.drawArrays(gl.TRIANGLES, 36, 6);
  245.  
  246.  
  247. //helicoptor
  248. //gl.uniform2fv(translationUniformLocation, [translationX, translationY]);
  249. //gl.drawArrays(gl.TRIANGLES, 0, 3);
  250.  
  251. }
  252. };
  253.  
  254. let lastSeconds =0;
  255.  
  256. const animate = function (milliseconds) {
  257. window.requestAnimationFrame(animate);
  258.  
  259. const seconds = milliseconds / 1000;
  260. const delta = seconds - lastSeconds;
  261.  
  262. if (leftPresed) {
  263. translationX -= MOVE_SPEED * delta;
  264. }
  265. if (rightPressed) {
  266. translationX += MOVE_SPEED * delta;
  267. }
  268. if (downPressed) {
  269. translationY -= MOVE_SPEED * delta;
  270. }
  271. if (upPressed) {
  272. translationY += MOVE_SPEED * delta;
  273. }
  274.  
  275. render();
  276.  
  277. lastSeconds = seconds;
  278. };
  279.  
  280. animate();
  281. }
  282.  
  283. function resizeCanvas (c) {
  284. check(isCanvas(c));
  285.  
  286. const cssToRealPixels = window.devicePixelRatio || 1.0;
  287.  
  288. const displayWidth = Math.floor(c.clientWidth * cssToRealPixels);
  289. const displayHeight = Math.floor(c.clientHeight * cssToRealPixels);
  290.  
  291. if (c.width !== displayWidth || canvas.height !== displayHeight) {
  292. c.width = c.clientWidth;
  293. c.height = c.clientHeight;
  294. return true;
  295. }
  296. else {
  297. return false;
  298. }
  299. }
  300.  
  301.  
  302.  
  303. // Helper functions to compile shaders
  304.  
  305. function createShader(gl, type, source) {
  306. check(isContext(gl), isString(source));
  307.  
  308. const shader = gl.createShader(type);
  309. gl.shaderSource(shader, source);
  310. gl.compileShader(shader);
  311.  
  312. const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
  313. if (!success) {
  314. console.error(gl.getShaderInfoLog(shader));
  315. gl.deleteShader(shader);
  316. return null;
  317. }
  318. return shader;
  319. }
  320.  
  321. function createProgram(gl, vertexShader, fragmentShader) {
  322. check(isContext(gl), isShader(vertexShader, fragmentShader));
  323.  
  324. const program = gl.createProgram();
  325. gl.attachShader(program, vertexShader);
  326. gl.attachShader(program, fragmentShader);
  327. gl.linkProgram(program);
  328.  
  329. const success = gl.getProgramParameter(program, gl.LINK_STATUS);
  330. if (!success) {
  331. console.error(gl.getProgramInfoLog(program));
  332. gl.deleteProgram(program);
  333. return null;
  334. }
  335. return program;
  336. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement