Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2019
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. "use strict";
  2.  
  3. var vertexShaderSource = `#version 300 es
  4.  
  5. // an attribute is an input (in) to a vertex shader.
  6. // It will receive data from a buffer
  7. in vec4 a_position;
  8. in vec4 a_color;
  9.  
  10. // A matrix to transform the positions by
  11. uniform mat4 u_matrix;
  12.  
  13. // a varying the color to the fragment shader
  14. out vec4 v_color;
  15.  
  16. // all shaders have a main function
  17. void main() {
  18.   // Multiply the position by the matrix.
  19.   gl_Position = u_matrix * a_position;
  20.  
  21.   // Pass the color to the fragment shader.
  22.   v_color = a_color;
  23. }
  24. `;
  25.  
  26. var fragmentShaderSource = `#version 300 es
  27.  
  28. precision mediump float;
  29.  
  30. // the varied color passed from the vertex shader
  31. in vec4 v_color;
  32.  
  33. // we need to declare an output for the fragment shader
  34. out vec4 outColor;
  35.  
  36. void main() {
  37.   outColor = v_color;
  38. }
  39. `;
  40.  
  41.  
  42. function main() {
  43.   // Get A WebGL context
  44.   /** @type {HTMLCanvasElement} */
  45.   var canvas = document.getElementById("canvas");
  46.   var gl = canvas.getContext("webgl2");
  47.   if (!gl) {
  48.     return;
  49.   }
  50.  
  51.   // Use our boilerplate utils to compile the shaders and link into a program
  52.   var program = webglUtils.createProgramFromSources(gl,
  53.       [vertexShaderSource, fragmentShaderSource]);
  54.  
  55.   // look up where the vertex data needs to go.
  56.   var positionAttributeLocation = gl.getAttribLocation(program, "a_position");
  57.   var colorAttributeLocation = gl.getAttribLocation(program, "a_color");
  58.  
  59.   // look up uniform locations
  60.   var matrixLocation = gl.getUniformLocation(program, "u_matrix");
  61.  
  62.   // Create a buffer
  63.   var positionBuffer = gl.createBuffer();
  64.  
  65.   // Create a vertex array object (attribute state)
  66.   var vao = gl.createVertexArray();
  67.  
  68.   // and make it the one we're currently working with
  69.   gl.bindVertexArray(vao);
  70.  
  71.   // Turn on the attribute
  72.   gl.enableVertexAttribArray(positionAttributeLocation);
  73.  
  74.   // Bind it to ARRAY_BUFFER (think of it as ARRAY_BUFFER = positionBuffer)
  75.   gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
  76.   // Set Geometry.
  77.   setGeometry(gl);
  78.  
  79.   // Tell the attribute how to get data out of positionBuffer (ARRAY_BUFFER)
  80.   var size = 3;          // 3 components per iteration
  81.   var type = gl.FLOAT;   // the data is 32bit floats
  82.   var normalize = false; // don't normalize the data
  83.   var stride = 0;        // 0 = move forward size * sizeof(type) each iteration to get the next position
  84.   var offset = 0;        // start at the beginning of the buffer
  85.   gl.vertexAttribPointer(
  86.       positionAttributeLocation, size, type, normalize, stride, offset);
  87.  
  88.   // create the color buffer, make it the current ARRAY_BUFFER
  89.   // and copy in the color values
  90.   var colorBuffer = gl.createBuffer();
  91.   gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer);
  92.   setColors(gl);
  93.  
  94.   // Turn on the attribute
  95.   gl.enableVertexAttribArray(colorAttributeLocation);
  96.  
  97.   // Tell the attribute how to get data out of colorBuffer (ARRAY_BUFFER)
  98.   var size = 3;          // 3 components per iteration
  99.   var type = gl.UNSIGNED_BYTE;   // the data is 8bit unsigned bytes
  100.   var normalize = true;  // convert from 0-255 to 0.0-1.0
  101.   var stride = 0;        // 0 = move forward size * sizeof(type) each iteration to get the next color
  102.   var offset = 0;        // start at the beginning of the buffer
  103.   gl.vertexAttribPointer(
  104.       colorAttributeLocation, size, type, normalize, stride, offset);
  105.  
  106.  
  107.   function radToDeg(r) {
  108.     return r * 180 / Math.PI;
  109.   }
  110.  
  111.   function degToRad(d) {
  112.     return d * Math.PI / 180;
  113.   }
  114.  
  115.   // First let's make some variables
  116.   // to hold the translation,
  117.   var fieldOfViewRadians = degToRad(60);
  118.   var cameraAngleRadians = degToRad(0);
  119.  
  120.   drawScene();
  121.  
  122.   // Setup a ui.
  123.   webglLessonsUI.setupSlider("#cameraAngle", {value: radToDeg(cameraAngleRadians), slide: updateCameraAngle, min: -360, max: 360});
  124.  
  125.   function updateCameraAngle(event, ui) {
  126.     cameraAngleRadians = degToRad(ui.value);
  127.     drawScene();
  128.   }
  129.  
  130.   // Draw the scene.
  131.   function drawScene() {
  132.     var numFs = 5;
  133.     var radius = 200;
  134.  
  135.     webglUtils.resizeCanvasToDisplaySize(gl.canvas);
  136.  
  137.     // Tell WebGL how to convert from clip space to pixels
  138.     gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
  139.  
  140.     // Clear the canvas
  141.     gl.clearColor(0, 0, 0, 0);
  142.     gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
  143.  
  144.     // turn on depth testing
  145.     gl.enable(gl.DEPTH_TEST);
  146.  
  147.     // tell webgl to cull faces
  148.     gl.enable(gl.CULL_FACE);
  149.  
  150.     // Tell it to use our program (pair of shaders)
  151.     gl.useProgram(program);
  152.  
  153.     // Bind the attribute/buffer set we want.
  154.     gl.bindVertexArray(vao);
  155.  
  156.     // Compute the matrix
  157.     var aspect = gl.canvas.clientWidth / gl.canvas.clientHeight;
  158.     var zNear = 1;
  159.     var zFar = 2000;
  160.     var projectionMatrix = m4.perspective(fieldOfViewRadians, aspect, zNear, zFar);
  161.  
  162.     var cameraMatrix = m4.yRotation(cameraAngleRadians);
  163.     cameraMatrix = m4.translate(cameraMatrix, 0, 0, radius * 1.5);
  164.  
  165.     // Make a view matrix from the camera matrix.
  166.     var viewMatrix = m4.inverse(cameraMatrix);
  167.  
  168.     // create a viewProjection matrix. This will both apply perspective
  169.     // AND move the world so that the camera is effectively the origin
  170.     var viewProjectionMatrix = m4.multiply(projectionMatrix, viewMatrix);
  171.  
  172.     // Draw 'F's in a circle
  173.     for (var ii = 0; ii < numFs; ++ii) {
  174.       var angle = ii * Math.PI * 2 / numFs;
  175.  
  176.       var x = Math.cos(angle) * radius;
  177.       var z = Math.sin(angle) * radius;
  178.       var matrix = m4.translate(viewProjectionMatrix, x, 0, z);
  179.  
  180.       // Set the matrix.
  181.       gl.uniformMatrix4fv(matrixLocation, false, matrix);
  182.  
  183.       // Draw the geometry.
  184.       var primitiveType = gl.TRIANGLES;
  185.       var offset = 0;
  186.       var count = 16 * 6;
  187.       gl.drawArrays(primitiveType, offset, count);
  188.     }
  189.   }
  190. }
  191.  
  192. // Fill the current ARRAY_BUFFER buffer
  193. // with the values that define a letter 'F'.
  194. function setGeometry(gl) {
  195.   var positions = new Float32Array([
  196.           // left column front
  197.           0,   0,  0,
  198.           0, 150,  0,
  199.           30,   0,  0,
  200.           0, 150,  0,
  201.           30, 150,  0,
  202.           30,   0,  0,
  203.  
  204.           // top rung front
  205.           30,   0,  0,
  206.           30,  30,  0,
  207.           100,   0,  0,
  208.           30,  30,  0,
  209.           100,  30,  0,
  210.           100,   0,  0,
  211.  
  212.           // middle rung front
  213.           30,  60,  0,
  214.           30,  90,  0,
  215.           67,  60,  0,
  216.           30,  90,  0,
  217.           67,  90,  0,
  218.           67,  60,  0,
  219.  
  220.           // left column back
  221.             0,   0,  30,
  222.            30,   0,  30,
  223.             0, 150,  30,
  224.             0, 150,  30,
  225.            30,   0,  30,
  226.            30, 150,  30,
  227.  
  228.           // top rung back
  229.            30,   0,  30,
  230.           100,   0,  30,
  231.            30,  30,  30,
  232.            30,  30,  30,
  233.           100,   0,  30,
  234.           100,  30,  30,
  235.  
  236.           // middle rung back
  237.            30,  60,  30,
  238.            67,  60,  30,
  239.            30,  90,  30,
  240.            30,  90,  30,
  241.            67,  60,  30,
  242.            67,  90,  30,
  243.  
  244.           // top
  245.             0,   0,   0,
  246.           100,   0,   0,
  247.           100,   0,  30,
  248.             0,   0,   0,
  249.           100,   0,  30,
  250.             0,   0,  30,
  251.  
  252.           // top rung right
  253.           100,   0,   0,
  254.           100,  30,   0,
  255.           100,  30,  30,
  256.           100,   0,   0,
  257.           100,  30,  30,
  258.           100,   0,  30,
  259.  
  260.           // under top rung
  261.           30,   30,   0,
  262.           30,   30,  30,
  263.           100,  30,  30,
  264.           30,   30,   0,
  265.           100,  30,  30,
  266.           100,  30,   0,
  267.  
  268.           // between top rung and middle
  269.           30,   30,   0,
  270.           30,   60,  30,
  271.           30,   30,  30,
  272.           30,   30,   0,
  273.           30,   60,   0,
  274.           30,   60,  30,
  275.  
  276.           // top of middle rung
  277.           30,   60,   0,
  278.           67,   60,  30,
  279.           30,   60,  30,
  280.           30,   60,   0,
  281.           67,   60,   0,
  282.           67,   60,  30,
  283.  
  284.           // right of middle rung
  285.           67,   60,   0,
  286.           67,   90,  30,
  287.           67,   60,  30,
  288.           67,   60,   0,
  289.           67,   90,   0,
  290.           67,   90,  30,
  291.  
  292.           // bottom of middle rung.
  293.           30,   90,   0,
  294.           30,   90,  30,
  295.           67,   90,  30,
  296.           30,   90,   0,
  297.           67,   90,  30,
  298.           67,   90,   0,
  299.  
  300.           // right of bottom
  301.           30,   90,   0,
  302.           30,  150,  30,
  303.           30,   90,  30,
  304.           30,   90,   0,
  305.           30,  150,   0,
  306.           30,  150,  30,
  307.  
  308.           // bottom
  309.           0,   150,   0,
  310.           0,   150,  30,
  311.           30,  150,  30,
  312.           0,   150,   0,
  313.           30,  150,  30,
  314.           30,  150,   0,
  315.  
  316.           // left side
  317.           0,   0,   0,
  318.           0,   0,  30,
  319.           0, 150,  30,
  320.           0,   0,   0,
  321.           0, 150,  30,
  322.           0, 150,   0,
  323.   ]);
  324.  
  325.   // Center the F around the origin and Flip it around. We do this because
  326.   // we're in 3D now with and +Y is up where as before when we started with 2D
  327.   // we had +Y as down.
  328.  
  329.   // We could do by changing all the values above but I'm lazy.
  330.   // We could also do it with a matrix at draw time but you should
  331.   // never do stuff at draw time if you can do it at init time.
  332.   var matrix = m4.xRotation(Math.PI);
  333.   matrix = m4.translate(matrix, -50, -75, -15);
  334.  
  335.   for (var ii = 0; ii < positions.length; ii += 3) {
  336.     var vector = m4.transformVector(matrix, [positions[ii + 0], positions[ii + 1], positions[ii + 2], 1]);
  337.     positions[ii + 0] = vector[0];
  338.     positions[ii + 1] = vector[1];
  339.     positions[ii + 2] = vector[2];
  340.   }
  341.  
  342.   gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);
  343. }
  344.  
  345. // Fill the current ARRAY_BUFFER buffer with colors for the 'F'.
  346. function setColors(gl) {
  347.   gl.bufferData(
  348.       gl.ARRAY_BUFFER,
  349.       new Uint8Array([
  350.           // left column front
  351.         200,  70, 120,
  352.         200,  70, 120,
  353.         200,  70, 120,
  354.         200,  70, 120,
  355.         200,  70, 120,
  356.         200,  70, 120,
  357.  
  358.           // top rung front
  359.         200,  70, 120,
  360.         200,  70, 120,
  361.         200,  70, 120,
  362.         200,  70, 120,
  363.         200,  70, 120,
  364.         200,  70, 120,
  365.  
  366.           // middle rung front
  367.         200,  70, 120,
  368.         200,  70, 120,
  369.         200,  70, 120,
  370.         200,  70, 120,
  371.         200,  70, 120,
  372.         200,  70, 120,
  373.  
  374.           // left column back
  375.         80, 70, 200,
  376.         80, 70, 200,
  377.         80, 70, 200,
  378.         80, 70, 200,
  379.         80, 70, 200,
  380.         80, 70, 200,
  381.  
  382.           // top rung back
  383.         80, 70, 200,
  384.         80, 70, 200,
  385.         80, 70, 200,
  386.         80, 70, 200,
  387.         80, 70, 200,
  388.         80, 70, 200,
  389.  
  390.           // middle rung back
  391.         80, 70, 200,
  392.         80, 70, 200,
  393.         80, 70, 200,
  394.         80, 70, 200,
  395.         80, 70, 200,
  396.         80, 70, 200,
  397.  
  398.           // top
  399.         70, 200, 210,
  400.         70, 200, 210,
  401.         70, 200, 210,
  402.         70, 200, 210,
  403.         70, 200, 210,
  404.         70, 200, 210,
  405.  
  406.           // top rung right
  407.         200, 200, 70,
  408.         200, 200, 70,
  409.         200, 200, 70,
  410.         200, 200, 70,
  411.         200, 200, 70,
  412.         200, 200, 70,
  413.  
  414.           // under top rung
  415.         210, 100, 70,
  416.         210, 100, 70,
  417.         210, 100, 70,
  418.         210, 100, 70,
  419.         210, 100, 70,
  420.         210, 100, 70,
  421.  
  422.           // between top rung and middle
  423.         210, 160, 70,
  424.         210, 160, 70,
  425.         210, 160, 70,
  426.         210, 160, 70,
  427.         210, 160, 70,
  428.         210, 160, 70,
  429.  
  430.           // top of middle rung
  431.         70, 180, 210,
  432.         70, 180, 210,
  433.         70, 180, 210,
  434.         70, 180, 210,
  435.         70, 180, 210,
  436.         70, 180, 210,
  437.  
  438.           // right of middle rung
  439.         100, 70, 210,
  440.         100, 70, 210,
  441.         100, 70, 210,
  442.         100, 70, 210,
  443.         100, 70, 210,
  444.         100, 70, 210,
  445.  
  446.           // bottom of middle rung.
  447.         76, 210, 100,
  448.         76, 210, 100,
  449.         76, 210, 100,
  450.         76, 210, 100,
  451.         76, 210, 100,
  452.         76, 210, 100,
  453.  
  454.           // right of bottom
  455.         140, 210, 80,
  456.         140, 210, 80,
  457.         140, 210, 80,
  458.         140, 210, 80,
  459.         140, 210, 80,
  460.         140, 210, 80,
  461.  
  462.           // bottom
  463.         90, 130, 110,
  464.         90, 130, 110,
  465.         90, 130, 110,
  466.         90, 130, 110,
  467.         90, 130, 110,
  468.         90, 130, 110,
  469.  
  470.           // left side
  471.         160, 160, 220,
  472.         160, 160, 220,
  473.         160, 160, 220,
  474.         160, 160, 220,
  475.         160, 160, 220,
  476.         160, 160, 220,
  477.       ]),
  478.       gl.STATIC_DRAW);
  479. }
  480.  
  481.  
  482.  
  483. var m4 = {
  484.  
  485.   perspective: function(fieldOfViewInRadians, aspect, near, far) {
  486.     var f = Math.tan(Math.PI * 0.5 - 0.5 * fieldOfViewInRadians);
  487.     var rangeInv = 1.0 / (near - far);
  488.  
  489.     return [
  490.       f / aspect, 0, 0, 0,
  491.       0, f, 0, 0,
  492.       0, 0, (near + far) * rangeInv, -1,
  493.       0, 0, near * far * rangeInv * 2, 0,
  494.     ];
  495.   },
  496.  
  497.   projection: function(width, height, depth) {
  498.     // Note: This matrix flips the Y axis so 0 is at the top.
  499.     return [
  500.        2 / width, 0, 0, 0,
  501.        0, -2 / height, 0, 0,
  502.        0, 0, 2 / depth, 0,
  503.       -1, 1, 0, 1,
  504.     ];
  505.   },
  506.  
  507.   multiply: function(a, b) {
  508.     var a00 = a[0 * 4 + 0];
  509.     var a01 = a[0 * 4 + 1];
  510.     var a02 = a[0 * 4 + 2];
  511.     var a03 = a[0 * 4 + 3];
  512.     var a10 = a[1 * 4 + 0];
  513.     var a11 = a[1 * 4 + 1];
  514.     var a12 = a[1 * 4 + 2];
  515.     var a13 = a[1 * 4 + 3];
  516.     var a20 = a[2 * 4 + 0];
  517.     var a21 = a[2 * 4 + 1];
  518.     var a22 = a[2 * 4 + 2];
  519.     var a23 = a[2 * 4 + 3];
  520.     var a30 = a[3 * 4 + 0];
  521.     var a31 = a[3 * 4 + 1];
  522.     var a32 = a[3 * 4 + 2];
  523.     var a33 = a[3 * 4 + 3];
  524.     var b00 = b[0 * 4 + 0];
  525.     var b01 = b[0 * 4 + 1];
  526.     var b02 = b[0 * 4 + 2];
  527.     var b03 = b[0 * 4 + 3];
  528.     var b10 = b[1 * 4 + 0];
  529.     var b11 = b[1 * 4 + 1];
  530.     var b12 = b[1 * 4 + 2];
  531.     var b13 = b[1 * 4 + 3];
  532.     var b20 = b[2 * 4 + 0];
  533.     var b21 = b[2 * 4 + 1];
  534.     var b22 = b[2 * 4 + 2];
  535.     var b23 = b[2 * 4 + 3];
  536.     var b30 = b[3 * 4 + 0];
  537.     var b31 = b[3 * 4 + 1];
  538.     var b32 = b[3 * 4 + 2];
  539.     var b33 = b[3 * 4 + 3];
  540.     return [
  541.       b00 * a00 + b01 * a10 + b02 * a20 + b03 * a30,
  542.       b00 * a01 + b01 * a11 + b02 * a21 + b03 * a31,
  543.       b00 * a02 + b01 * a12 + b02 * a22 + b03 * a32,
  544.       b00 * a03 + b01 * a13 + b02 * a23 + b03 * a33,
  545.       b10 * a00 + b11 * a10 + b12 * a20 + b13 * a30,
  546.       b10 * a01 + b11 * a11 + b12 * a21 + b13 * a31,
  547.       b10 * a02 + b11 * a12 + b12 * a22 + b13 * a32,
  548.       b10 * a03 + b11 * a13 + b12 * a23 + b13 * a33,
  549.       b20 * a00 + b21 * a10 + b22 * a20 + b23 * a30,
  550.       b20 * a01 + b21 * a11 + b22 * a21 + b23 * a31,
  551.       b20 * a02 + b21 * a12 + b22 * a22 + b23 * a32,
  552.       b20 * a03 + b21 * a13 + b22 * a23 + b23 * a33,
  553.       b30 * a00 + b31 * a10 + b32 * a20 + b33 * a30,
  554.       b30 * a01 + b31 * a11 + b32 * a21 + b33 * a31,
  555.       b30 * a02 + b31 * a12 + b32 * a22 + b33 * a32,
  556.       b30 * a03 + b31 * a13 + b32 * a23 + b33 * a33,
  557.     ];
  558.   },
  559.  
  560.   translation: function(tx, ty, tz) {
  561.     return [
  562.        1,  0,  0,  0,
  563.        0,  1,  0,  0,
  564.        0,  0,  1,  0,
  565.        tx, ty, tz, 1,
  566.     ];
  567.   },
  568.  
  569.   xRotation: function(angleInRadians) {
  570.     var c = Math.cos(angleInRadians);
  571.     var s = Math.sin(angleInRadians);
  572.  
  573.     return [
  574.       1, 0, 0, 0,
  575.       0, c, s, 0,
  576.       0, -s, c, 0,
  577.       0, 0, 0, 1,
  578.     ];
  579.   },
  580.  
  581.   yRotation: function(angleInRadians) {
  582.     var c = Math.cos(angleInRadians);
  583.     var s = Math.sin(angleInRadians);
  584.  
  585.     return [
  586.       c, 0, -s, 0,
  587.       0, 1, 0, 0,
  588.       s, 0, c, 0,
  589.       0, 0, 0, 1,
  590.     ];
  591.   },
  592.  
  593.   zRotation: function(angleInRadians) {
  594.     var c = Math.cos(angleInRadians);
  595.     var s = Math.sin(angleInRadians);
  596.  
  597.     return [
  598.        c, s, 0, 0,
  599.       -s, c, 0, 0,
  600.        0, 0, 1, 0,
  601.        0, 0, 0, 1,
  602.     ];
  603.   },
  604.  
  605.   scaling: function(sx, sy, sz) {
  606.     return [
  607.       sx, 0,  0,  0,
  608.       0, sy,  0,  0,
  609.       0,  0, sz,  0,
  610.       0,  0,  0,  1,
  611.     ];
  612.   },
  613.  
  614.   translate: function(m, tx, ty, tz) {
  615.     return m4.multiply(m, m4.translation(tx, ty, tz));
  616.   },
  617.  
  618.   xRotate: function(m, angleInRadians) {
  619.     return m4.multiply(m, m4.xRotation(angleInRadians));
  620.   },
  621.  
  622.   yRotate: function(m, angleInRadians) {
  623.     return m4.multiply(m, m4.yRotation(angleInRadians));
  624.   },
  625.  
  626.   zRotate: function(m, angleInRadians) {
  627.     return m4.multiply(m, m4.zRotation(angleInRadians));
  628.   },
  629.  
  630.   scale: function(m, sx, sy, sz) {
  631.     return m4.multiply(m, m4.scaling(sx, sy, sz));
  632.   },
  633.  
  634.   inverse: function(m) {
  635.     var m00 = m[0 * 4 + 0];
  636.     var m01 = m[0 * 4 + 1];
  637.     var m02 = m[0 * 4 + 2];
  638.     var m03 = m[0 * 4 + 3];
  639.     var m10 = m[1 * 4 + 0];
  640.     var m11 = m[1 * 4 + 1];
  641.     var m12 = m[1 * 4 + 2];
  642.     var m13 = m[1 * 4 + 3];
  643.     var m20 = m[2 * 4 + 0];
  644.     var m21 = m[2 * 4 + 1];
  645.     var m22 = m[2 * 4 + 2];
  646.     var m23 = m[2 * 4 + 3];
  647.     var m30 = m[3 * 4 + 0];
  648.     var m31 = m[3 * 4 + 1];
  649.     var m32 = m[3 * 4 + 2];
  650.     var m33 = m[3 * 4 + 3];
  651.     var tmp_0  = m22 * m33;
  652.     var tmp_1  = m32 * m23;
  653.     var tmp_2  = m12 * m33;
  654.     var tmp_3  = m32 * m13;
  655.     var tmp_4  = m12 * m23;
  656.     var tmp_5  = m22 * m13;
  657.     var tmp_6  = m02 * m33;
  658.     var tmp_7  = m32 * m03;
  659.     var tmp_8  = m02 * m23;
  660.     var tmp_9  = m22 * m03;
  661.     var tmp_10 = m02 * m13;
  662.     var tmp_11 = m12 * m03;
  663.     var tmp_12 = m20 * m31;
  664.     var tmp_13 = m30 * m21;
  665.     var tmp_14 = m10 * m31;
  666.     var tmp_15 = m30 * m11;
  667.     var tmp_16 = m10 * m21;
  668.     var tmp_17 = m20 * m11;
  669.     var tmp_18 = m00 * m31;
  670.     var tmp_19 = m30 * m01;
  671.     var tmp_20 = m00 * m21;
  672.     var tmp_21 = m20 * m01;
  673.     var tmp_22 = m00 * m11;
  674.     var tmp_23 = m10 * m01;
  675.  
  676.     var t0 = (tmp_0 * m11 + tmp_3 * m21 + tmp_4 * m31) -
  677.              (tmp_1 * m11 + tmp_2 * m21 + tmp_5 * m31);
  678.     var t1 = (tmp_1 * m01 + tmp_6 * m21 + tmp_9 * m31) -
  679.              (tmp_0 * m01 + tmp_7 * m21 + tmp_8 * m31);
  680.     var t2 = (tmp_2 * m01 + tmp_7 * m11 + tmp_10 * m31) -
  681.              (tmp_3 * m01 + tmp_6 * m11 + tmp_11 * m31);
  682.     var t3 = (tmp_5 * m01 + tmp_8 * m11 + tmp_11 * m21) -
  683.              (tmp_4 * m01 + tmp_9 * m11 + tmp_10 * m21);
  684.  
  685.     var d = 1.0 / (m00 * t0 + m10 * t1 + m20 * t2 + m30 * t3);
  686.  
  687.     return [
  688.       d * t0,
  689.       d * t1,
  690.       d * t2,
  691.       d * t3,
  692.       d * ((tmp_1 * m10 + tmp_2 * m20 + tmp_5 * m30) -
  693.            (tmp_0 * m10 + tmp_3 * m20 + tmp_4 * m30)),
  694.       d * ((tmp_0 * m00 + tmp_7 * m20 + tmp_8 * m30) -
  695.            (tmp_1 * m00 + tmp_6 * m20 + tmp_9 * m30)),
  696.       d * ((tmp_3 * m00 + tmp_6 * m10 + tmp_11 * m30) -
  697.            (tmp_2 * m00 + tmp_7 * m10 + tmp_10 * m30)),
  698.       d * ((tmp_4 * m00 + tmp_9 * m10 + tmp_10 * m20) -
  699.            (tmp_5 * m00 + tmp_8 * m10 + tmp_11 * m20)),
  700.       d * ((tmp_12 * m13 + tmp_15 * m23 + tmp_16 * m33) -
  701.            (tmp_13 * m13 + tmp_14 * m23 + tmp_17 * m33)),
  702.       d * ((tmp_13 * m03 + tmp_18 * m23 + tmp_21 * m33) -
  703.            (tmp_12 * m03 + tmp_19 * m23 + tmp_20 * m33)),
  704.       d * ((tmp_14 * m03 + tmp_19 * m13 + tmp_22 * m33) -
  705.            (tmp_15 * m03 + tmp_18 * m13 + tmp_23 * m33)),
  706.       d * ((tmp_17 * m03 + tmp_20 * m13 + tmp_23 * m23) -
  707.            (tmp_16 * m03 + tmp_21 * m13 + tmp_22 * m23)),
  708.       d * ((tmp_14 * m22 + tmp_17 * m32 + tmp_13 * m12) -
  709.            (tmp_16 * m32 + tmp_12 * m12 + tmp_15 * m22)),
  710.       d * ((tmp_20 * m32 + tmp_12 * m02 + tmp_19 * m22) -
  711.            (tmp_18 * m22 + tmp_21 * m32 + tmp_13 * m02)),
  712.       d * ((tmp_18 * m12 + tmp_23 * m32 + tmp_15 * m02) -
  713.            (tmp_22 * m32 + tmp_14 * m02 + tmp_19 * m12)),
  714.       d * ((tmp_22 * m22 + tmp_16 * m02 + tmp_21 * m12) -
  715.            (tmp_20 * m12 + tmp_23 * m22 + tmp_17 * m02)),
  716.     ];
  717.   },
  718.  
  719.   transformVector: function(m, v) {
  720.     var dst = [];
  721.     for (var i = 0; i < 4; ++i) {
  722.       dst[i] = 0.0;
  723.       for (var j = 0; j < 4; ++j) {
  724.         dst[i] += v[j] * m[j * 4 + i];
  725.       }
  726.     }
  727.     return dst;
  728.   },
  729.  
  730. };
  731.  
  732. main();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement