Guest User

Untitled

a guest
Sep 19th, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.05 KB | None | 0 0
  1. var gl;
  2. var shaderProgram;
  3. var aVertexPosition;
  4.  
  5. var centerOffsetX = 0;
  6. var centerOffsetY = 0;
  7.  
  8. var zoom = 1;
  9. var zoomCenterX = 0;
  10. var zoomCenterY = 0;
  11.  
  12. var mouseX, mouseY;
  13.  
  14. var vertexPositionBuffer;
  15.  
  16.  
  17. var baseCorners = [
  18. [ 0.7, 1.2],
  19. [-2.2, 1.2],
  20. [ 0.7, -1.2],
  21. [-2.2, -1.2],
  22. ];
  23.  
  24. var corners = [];
  25.  
  26. //------------------------------------------------------------------------
  27.  
  28. function initGL(canvas) {
  29. try {
  30. gl = canvas.getContext("webgl");
  31. gl.viewportWidth = canvas.width;
  32. gl.viewportHeight = canvas.height;
  33. } catch(e) {
  34. }
  35. if (!gl) {
  36. alert("Could not initialise WebGL, sorry :-(");
  37. }
  38. }
  39.  
  40. function initBuffers() {
  41. vertexPositionBuffer = gl.createBuffer();
  42. gl.bindBuffer(gl.ARRAY_BUFFER, vertexPositionBuffer);
  43. var vertices = [
  44. 1.0, 1.0,
  45. -1.0, 1.0,
  46. 1.0, -1.0,
  47. -1.0, -1.0,
  48. ];
  49. gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
  50. vertexPositionBuffer.itemSize = 2;
  51. vertexPositionBuffer.numItems = 4;
  52. }
  53.  
  54. function getShader(gl, id) {
  55. var shaderScript = document.getElementById(id);
  56. if (!shaderScript) {
  57. return null;
  58. }
  59.  
  60. var str = "";
  61. var k = shaderScript.firstChild;
  62. while (k) {
  63. if (k.nodeType == 3) {
  64. str += k.textContent;
  65. }
  66. k = k.nextSibling;
  67. }
  68.  
  69. var shader;
  70. if (shaderScript.type == "x-shader/x-fragment") {
  71. shader = gl.createShader(gl.FRAGMENT_SHADER);
  72. } else if (shaderScript.type == "x-shader/x-vertex") {
  73. shader = gl.createShader(gl.VERTEX_SHADER);
  74. } else {
  75. return null;
  76. }
  77.  
  78. gl.shaderSource(shader, str);
  79. gl.compileShader(shader);
  80.  
  81. if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
  82. alert(gl.getShaderInfoLog(shader));
  83. return null;
  84. }
  85.  
  86. return shader;
  87. }
  88.  
  89. function initShaders() {
  90. var fragmentShader = getShader(gl, "shader-fs");
  91. var vertexShader = getShader(gl, "shader-vs");
  92.  
  93. shaderProgram = gl.createProgram();
  94. gl.attachShader(shaderProgram, vertexShader);
  95. gl.attachShader(shaderProgram, fragmentShader);
  96. gl.linkProgram(shaderProgram);
  97.  
  98. if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
  99. alert("Could not initialise shaders");
  100. }
  101.  
  102. gl.useProgram(shaderProgram);
  103.  
  104. aVertexPosition = gl.getAttribLocation(shaderProgram, "aVertexPosition");
  105. gl.enableVertexAttribArray(aVertexPosition);
  106.  
  107. aPlotPosition = gl.getAttribLocation(shaderProgram, "aPlotPosition");
  108. gl.enableVertexAttribArray(aPlotPosition);
  109. }
  110.  
  111. function drawScene() {
  112. gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight);
  113. gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
  114.  
  115. gl.bindBuffer(gl.ARRAY_BUFFER, vertexPositionBuffer);
  116. gl.vertexAttribPointer(aVertexPosition, vertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);
  117.  
  118.  
  119. var plotPositionBuffer = gl.createBuffer();
  120. gl.bindBuffer(gl.ARRAY_BUFFER, plotPositionBuffer);
  121. var cornerIx;
  122. corners = [];
  123. for (cornerIx in baseCorners) {
  124. x = baseCorners[cornerIx][0];
  125. y = baseCorners[cornerIx][1];
  126. corners.push(x / zoom + centerOffsetX);
  127. corners.push(y / zoom + centerOffsetY);
  128. }
  129.  
  130. gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(corners), gl.DYNAMIC_DRAW);
  131. gl.vertexAttribPointer(aPlotPosition, 2, gl.FLOAT, false, 0, 0);
  132.  
  133. gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
  134.  
  135. gl.deleteBuffer(plotPositionBuffer);
  136. }
  137.  
  138. function resetZoom() {
  139. zoom = 1.0;
  140. centerOffsetX = 0.5;
  141. centerOffsetY = 0.2;
  142.  
  143. $("#zoomOutput").val(zoom);
  144. $("#zoomCenterXInput").val(zoomCenterX);
  145. $("#zoomCenterYInput").val(zoomCenterY);
  146. $("#centerOffsetXOutput").val(centerOffsetX);
  147. $("#centerOffsetYOutput").val(centerOffsetY);
  148. }
  149.  
  150. function startFractalDraw() {
  151. resetZoom();
  152.  
  153. var canvas = document.getElementById("my_canvas");
  154. initGL(canvas);
  155. initShaders()
  156. initBuffers();
  157.  
  158. gl.clearColor(0.0, 0.0, 0.0, 1.0);
  159.  
  160. drawScene();
  161. }
  162.  
  163. $(function() {
  164. startFractalDraw();
  165.  
  166. var wnd = $(window);
  167. var canvas = $("#my_canvas");
  168.  
  169. wnd.resize(function(e){
  170. canvas.height(wnd.height());
  171.  
  172. var aspectRatio = 1.25;
  173. var ww = wnd.height() * aspectRatio
  174. canvas.width(ww);
  175.  
  176. canvas.css('margin-left', (wnd.width() / 2 - ww / 2)+'px');
  177.  
  178. gl.viewportWidth = canvas.width();
  179. gl.viewportHeight = canvas.height();
  180.  
  181. drawScene();
  182. }).trigger('resize');
  183.  
  184. $("#reset_zoom").click(function() {
  185. resetZoom();
  186. drawScene();
  187. });
  188.  
  189. $('#my_canvas').mousewheel(function(event) {
  190. zoom *= (event.deltaY > 0) ? 1.02 : 0.98;
  191. $("#zoomOutput").val(zoom);
  192. $("#centerOffsetXOutput").val(centerOffsetX);
  193. $("#centerOffsetYOutput").val(centerOffsetY);
  194. drawScene();
  195. });
  196.  
  197. $( "#my_canvas" ).mousemove(function( event ) {
  198. centerOffsetX = -2.2 + 2.9 * (event.pageX - $(this).offset().left) / $(this).width();
  199. centerOffsetY = 1.2 - 2.4 * (event.pageY - $(this).offset().top) / $(this).height();
  200. // console.log(zoomCenterX + " " + zoomCenterY);
  201. });
  202. });
Add Comment
Please, Sign In to add comment