Advertisement
Guest User

Untitled

a guest
Sep 9th, 2012
541
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. <!-- saved from url=(0052)http://learningwebgl.com/lessons/lesson11/index.html -->
  3. <html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  4. <title>Learning WebGL — lesson 11</title>
  5.  
  6.  
  7. <script type="text/javascript" src="./Learning WebGL — lesson 11_files/glMatrix-0.9.5.min.js"></script>
  8. <script type="text/javascript" src="./Learning WebGL — lesson 11_files/webgl-utils.js"></script>
  9.  
  10. <script id="shader-fs" type="x-shader/x-fragment">
  11.     precision mediump float;
  12.  
  13.     varying vec2 vTextureCoord;
  14.     varying vec3 vLightWeighting;
  15.     uniform sampler2D uSampler;
  16.     varying vec4 vColor;    //added
  17.     void main(void) {
  18.         gl_FragColor = vec4(vColor.rgb * vLightWeighting, vColor.a);
  19.  
  20.     }
  21. </script>
  22.  
  23. <script id="shader-vs" type="x-shader/x-vertex">
  24.     attribute vec3 aVertexPosition;
  25.     attribute vec3 aVertexNormal;
  26.     attribute vec2 aTextureCoord;
  27.     attribute vec4 aVertexColor;    //added
  28.  
  29.     uniform mat4 uMVMatrix;
  30.     uniform mat4 uPMatrix;
  31.     uniform mat3 uNMatrix;
  32.  
  33.     uniform vec3 uAmbientColor;
  34.  
  35.     uniform vec3 uLightingDirection;
  36.     uniform vec3 uDirectionalColor;
  37.  
  38.     uniform bool uUseLighting;
  39.  
  40.     varying vec2 vTextureCoord;
  41.     varying vec3 vLightWeighting;
  42.     varying vec4 vColor;    //added
  43.  
  44.     void main(void) {
  45.         gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
  46.         vColor = aVertexColor;
  47.         if (!uUseLighting) {
  48.             vLightWeighting = vec3(1.0, 1.0, 1.0);
  49.         } else {
  50.             vec3 transformedNormal = uNMatrix * aVertexNormal;
  51.             float directionalLightWeighting = max(dot(transformedNormal, uLightingDirection), 0.0);
  52.             vLightWeighting = uAmbientColor + uDirectionalColor * directionalLightWeighting;
  53.         }
  54.     }
  55. </script>
  56.  
  57.  
  58. <script type="text/javascript">
  59.  
  60.     var gl;
  61.  
  62.     function initGL(canvas) {
  63.         try {
  64.             gl = canvas.getContext("experimental-webgl");
  65.             gl.viewportWidth = canvas.width;
  66.             gl.viewportHeight = canvas.height;
  67.         } catch (e) {
  68.         }
  69.         if (!gl) {
  70.             alert("Could not initialise WebGL, sorry :-(");
  71.         }
  72.     }
  73.  
  74.  
  75.     function getShader(gl, id) {
  76.         var shaderScript = document.getElementById(id);
  77.         if (!shaderScript) {
  78.             return null;
  79.         }
  80.  
  81.         var str = "";
  82.         var k = shaderScript.firstChild;
  83.         while (k) {
  84.             if (k.nodeType == 3) {
  85.                 str += k.textContent;
  86.             }
  87.             k = k.nextSibling;
  88.         }
  89.  
  90.         var shader;
  91.         if (shaderScript.type == "x-shader/x-fragment") {
  92.             shader = gl.createShader(gl.FRAGMENT_SHADER);
  93.         } else if (shaderScript.type == "x-shader/x-vertex") {
  94.             shader = gl.createShader(gl.VERTEX_SHADER);
  95.         } else {
  96.             return null;
  97.         }
  98.  
  99.         gl.shaderSource(shader, str);
  100.         gl.compileShader(shader);
  101.  
  102.         if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
  103.             alert(gl.getShaderInfoLog(shader));
  104.             return null;
  105.         }
  106.  
  107.         return shader;
  108.     }
  109.  
  110.  
  111.     var shaderProgram;
  112.  
  113.     function initShaders() {
  114.         var fragmentShader = getShader(gl, "shader-fs");
  115.         var vertexShader = getShader(gl, "shader-vs");
  116.  
  117.         shaderProgram = gl.createProgram();
  118.         gl.attachShader(shaderProgram, vertexShader);
  119.         gl.attachShader(shaderProgram, fragmentShader);
  120.         gl.linkProgram(shaderProgram);
  121.  
  122.         if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
  123.             alert("Could not initialise shaders");
  124.         }
  125.  
  126.         gl.useProgram(shaderProgram);
  127.  
  128.         shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
  129.         gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);
  130.  
  131.         shaderProgram.vertexNormalAttribute = gl.getAttribLocation(shaderProgram, "aVertexNormal");
  132.         gl.enableVertexAttribArray(shaderProgram.vertexNormalAttribute);
  133.  
  134.         shaderProgram.vertexColorAttribute = gl.getAttribLocation(shaderProgram, "aVertexColor");
  135.         gl.enableVertexAttribArray(shaderProgram.vertexColorAttribute);
  136.  
  137.         shaderProgram.pMatrixUniform = gl.getUniformLocation(shaderProgram, "uPMatrix");
  138.         shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");
  139.         shaderProgram.nMatrixUniform = gl.getUniformLocation(shaderProgram, "uNMatrix");
  140.         shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler");
  141.         shaderProgram.useLightingUniform = gl.getUniformLocation(shaderProgram, "uUseLighting");
  142.         shaderProgram.ambientColorUniform = gl.getUniformLocation(shaderProgram, "uAmbientColor");
  143.         shaderProgram.lightingDirectionUniform = gl.getUniformLocation(shaderProgram, "uLightingDirection");
  144.         shaderProgram.directionalColorUniform = gl.getUniformLocation(shaderProgram, "uDirectionalColor");
  145.     }
  146.  
  147.     var mvMatrix = mat4.create();
  148.     var mvMatrixStack = [];
  149.     var pMatrix = mat4.create();
  150.  
  151.     function mvPushMatrix() {
  152.         var copy = mat4.create();
  153.         mat4.set(mvMatrix, copy);
  154.         mvMatrixStack.push(copy);
  155.     }
  156.  
  157.     function mvPopMatrix() {
  158.         if (mvMatrixStack.length == 0) {
  159.             throw "Invalid popMatrix!";
  160.         }
  161.         mvMatrix = mvMatrixStack.pop();
  162.     }
  163.  
  164.     function setMatrixUniforms() {
  165.         gl.uniformMatrix4fv(shaderProgram.pMatrixUniform, false, pMatrix);
  166.         gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mvMatrix);
  167.  
  168.         var normalMatrix = mat3.create();
  169.         mat4.toInverseMat3(mvMatrix, normalMatrix);
  170.         mat3.transpose(normalMatrix);
  171.         gl.uniformMatrix3fv(shaderProgram.nMatrixUniform, false, normalMatrix);
  172.     }
  173.  
  174.  
  175.     function degToRad(degrees) {
  176.         return degrees * Math.PI / 180;
  177.     }
  178.  
  179.  
  180.     var mouseDown = false;
  181.     var lastMouseX = null;
  182.     var lastMouseY = null;
  183.  
  184.     var moonRotationMatrix = mat4.create();
  185.     mat4.identity(moonRotationMatrix);
  186.  
  187.     function handleMouseDown(event) {
  188.         mouseDown = true;
  189.         lastMouseX = event.clientX;
  190.         lastMouseY = event.clientY;
  191.     }
  192.  
  193.  
  194.     function handleMouseUp(event) {
  195.         mouseDown = false;
  196.     }
  197.  
  198.  
  199.     function handleMouseMove(event) {
  200.         if (!mouseDown) {
  201.             return;
  202.         }
  203.         var newX = event.clientX;
  204.         var newY = event.clientY;
  205.  
  206.         var deltaX = newX - lastMouseX
  207.         var newRotationMatrix = mat4.create();
  208.         mat4.identity(newRotationMatrix);
  209.         mat4.rotate(newRotationMatrix, degToRad(deltaX / 10), [0, 1, 0]);
  210.  
  211.         var deltaY = newY - lastMouseY;
  212.         mat4.rotate(newRotationMatrix, degToRad(deltaY / 10), [1, 0, 0]);
  213.  
  214.         mat4.multiply(newRotationMatrix, moonRotationMatrix, moonRotationMatrix);
  215.  
  216.  
  217.         lastMouseX = newX
  218.         lastMouseY = newY;
  219.     }
  220.  
  221.     var z=-6.0;
  222.     function handleMouseWheel(event)
  223.     {
  224.         var delta = 0;
  225.         if (!event) /* For IE. */
  226.             event = window.event;
  227.         if (event.wheelDelta) { /* IE/Opera. */
  228.             delta = event.wheelDelta/120;
  229.         } else if (event.detail) { /** Mozilla case. */
  230.             /** In Mozilla, sign of delta is different than in IE.
  231.              * Also, delta is multiple of 3.
  232.              */
  233.             delta = -event.detail/3;
  234.         }
  235.         /** If delta is nonzero, handle it.
  236.          * Basically, delta is now positive if wheel was scrolled up,
  237.          * and negative, if wheel was scrolled down.
  238.          */
  239.         if (delta)
  240.             handleScroll(delta);
  241.         /** Prevent default actions caused by mouse wheel.
  242.          * That might be ugly, but we handle scrolls somehow
  243.          * anyway, so don?t bother here..
  244.          */
  245.         if (event.preventDefault)
  246.             event.preventDefault();
  247.         event.returnValue = false;
  248.  
  249.     }
  250.  
  251.     function handleScroll(delta)
  252.     {
  253.         if (delta < 0)
  254.             z=z-0.25;
  255.         else
  256.             z=z+0.25;
  257.     }
  258.  
  259.     var moonVertexPositionBuffer;
  260.     var moonVertexNormalBuffer;
  261.     var moonVertexTextureCoordBuffer;
  262.     var moonVertexIndexBuffer;
  263.     var moonVertexColourBuffer;
  264.  
  265.     function initBuffers() {
  266.         var latitudeBands = 30;
  267.         var longitudeBands = 30;
  268.         var radius = 2;
  269.  
  270.         var vertexPositionData = [];
  271.         var normalData = [];
  272.         var textureCoordData = [];
  273.         for (var latNumber=0; latNumber <= latitudeBands; latNumber++) {
  274.             var theta = latNumber * Math.PI / latitudeBands;
  275.             var sinTheta = Math.sin(theta);
  276.             var cosTheta = Math.cos(theta);
  277.  
  278.             for (var longNumber=0; longNumber <= longitudeBands; longNumber++) {
  279.                 var phi = longNumber * 2 * Math.PI / longitudeBands;
  280.                 var sinPhi = Math.sin(phi);
  281.                 var cosPhi = Math.cos(phi);
  282.  
  283.                 var x = cosPhi * sinTheta;
  284.                 var y = cosTheta;
  285.                 var z = sinPhi * sinTheta;
  286.                 var u = 1 - (longNumber / longitudeBands);
  287.                 var v = 1 - (latNumber / latitudeBands);
  288.  
  289.                 normalData.push(x);
  290.                 normalData.push(y);
  291.                 normalData.push(z);
  292.                 textureCoordData.push(u);
  293.                 textureCoordData.push(v);
  294.                 vertexPositionData.push(radius * x);
  295.                 vertexPositionData.push(radius * y);
  296.                 vertexPositionData.push(radius * z);
  297.             }
  298.         }
  299.  
  300.         var unpackedNormalData = [];
  301.         var unpackedVertexPositionData = [];
  302.         for (var latNumber=0; latNumber < latitudeBands; latNumber++) {
  303.             for (var longNumber=0; longNumber < longitudeBands; longNumber++) {
  304.                 var index = latNumber*(longitudeBands+1)+longNumber;
  305.                 unpackedVertexPositionData.push(vertexPositionData[index*3]);
  306.                 unpackedVertexPositionData.push(vertexPositionData[index*3+1]);
  307.                 unpackedVertexPositionData.push(vertexPositionData[index*3+2]);
  308.                 unpackedNormalData.push(normalData[index*3]);
  309.                 unpackedNormalData.push(normalData[index*3+1]);
  310.                 unpackedNormalData.push(normalData[index*3+2]);
  311.                 var index = (latNumber+1)*(longitudeBands+1)+longNumber;
  312.                 unpackedVertexPositionData.push(vertexPositionData[index*3]);
  313.                 unpackedVertexPositionData.push(vertexPositionData[index*3+1]);
  314.                 unpackedVertexPositionData.push(vertexPositionData[index*3+2]);
  315.                 unpackedNormalData.push(normalData[index*3]);
  316.                 unpackedNormalData.push(normalData[index*3+1]);
  317.                 unpackedNormalData.push(normalData[index*3+2]);
  318.                 var index = latNumber*(longitudeBands+1)+longNumber+1;
  319.                 unpackedVertexPositionData.push(vertexPositionData[index*3]);
  320.                 unpackedVertexPositionData.push(vertexPositionData[index*3+1]);
  321.                 unpackedVertexPositionData.push(vertexPositionData[index*3+2]);
  322.                 unpackedNormalData.push(normalData[index*3]);
  323.                 unpackedNormalData.push(normalData[index*3+1]);
  324.                 unpackedNormalData.push(normalData[index*3+2]);
  325.                 var index = (latNumber+1)*(longitudeBands+1)+longNumber+1;
  326.                 unpackedVertexPositionData.push(vertexPositionData[index*3]);
  327.                 unpackedVertexPositionData.push(vertexPositionData[index*3+1]);
  328.                 unpackedVertexPositionData.push(vertexPositionData[index*3+2]);
  329.                 unpackedNormalData.push(normalData[index*3]);
  330.                 unpackedNormalData.push(normalData[index*3+1]);
  331.                 unpackedNormalData.push(normalData[index*3+2]);
  332.             }
  333.         }
  334.  
  335.         var indexData = [];
  336.         for (var latNumber=0; latNumber < latitudeBands; latNumber++) {
  337.             for (var longNumber=0; longNumber < longitudeBands; longNumber++) {
  338.                 var first = (latNumber * longitudeBands + longNumber)*4;
  339.                 indexData.push(first);
  340.                 indexData.push(first+1);
  341.                 indexData.push(first+2);
  342.                 indexData.push(first+1);
  343.                 indexData.push(first+3);
  344.                 indexData.push(first+2);
  345.             }
  346.         }
  347.  
  348.         moonVertexNormalBuffer = gl.createBuffer();
  349.         gl.bindBuffer(gl.ARRAY_BUFFER, moonVertexNormalBuffer);
  350.         gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(unpackedNormalData), gl.STATIC_DRAW);
  351.         moonVertexNormalBuffer.itemSize = 3;
  352.         moonVertexNormalBuffer.numItems = unpackedNormalData.length / 3;
  353.  
  354.         moonVertexTextureCoordBuffer = gl.createBuffer();
  355.         gl.bindBuffer(gl.ARRAY_BUFFER, moonVertexTextureCoordBuffer);
  356.         gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(textureCoordData), gl.STATIC_DRAW);
  357.         moonVertexTextureCoordBuffer.itemSize = 2;
  358.         moonVertexTextureCoordBuffer.numItems = textureCoordData.length / 2;
  359.  
  360.         moonVertexPositionBuffer = gl.createBuffer();
  361.         gl.bindBuffer(gl.ARRAY_BUFFER, moonVertexPositionBuffer);
  362.         gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(unpackedVertexPositionData), gl.STATIC_DRAW);
  363.         moonVertexPositionBuffer.itemSize = 3;
  364.         moonVertexPositionBuffer.numItems = unpackedVertexPositionData.length / 3;
  365.  
  366.         moonVertexIndexBuffer = gl.createBuffer();
  367.         gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, moonVertexIndexBuffer);
  368.         gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexData), gl.STATIC_DRAW);
  369.         moonVertexIndexBuffer.itemSize = 1;
  370.         moonVertexIndexBuffer.numItems = indexData.length;
  371.  
  372.         var colors = [];
  373.  
  374.         for (var latNumber=0; latNumber < latitudeBands; latNumber++) {
  375.             for (var longNumber=0; longNumber < longitudeBands*2; longNumber++) {
  376.                 r1 = Math.random();
  377.                 r2 = Math.random();
  378.                 r3 = Math.random();
  379.                 colors.push(r1);
  380.                 colors.push(r2);
  381.                 colors.push(r3);
  382.                 colors.push(1.0);
  383.                 colors.push(r1);
  384.                 colors.push(r2);
  385.                 colors.push(r3);
  386.                 colors.push(1.0);
  387.                 colors.push(r1);
  388.                 colors.push(r2);
  389.                 colors.push(r3);
  390.                 colors.push(1.0);
  391.                 colors.push(r1);
  392.                 colors.push(r2);
  393.                 colors.push(r3);
  394.                 colors.push(1.0);
  395.             }
  396.         }
  397.         moonVertexColourBuffer = gl.createBuffer();
  398.         gl.bindBuffer(gl.ARRAY_BUFFER, moonVertexColourBuffer);
  399.         gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
  400.         moonVertexColourBuffer.itemSize = 4;
  401.         moonVertexColourBuffer.numItems = colors.length/4;
  402.     }
  403.  
  404.  
  405.     function drawScene() {
  406.         gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight);
  407.         gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
  408.  
  409.         mat4.perspective(45, gl.viewportWidth / gl.viewportHeight, 0.1, 100.0, pMatrix);
  410.  
  411.         var lighting = document.getElementById("lighting").checked;
  412.         gl.uniform1i(shaderProgram.useLightingUniform, lighting);
  413.         if (lighting) {
  414.             gl.uniform3f(
  415.                 shaderProgram.ambientColorUniform,
  416.                 parseFloat(document.getElementById("ambientR").value),
  417.                 parseFloat(document.getElementById("ambientG").value),
  418.                 parseFloat(document.getElementById("ambientB").value)
  419.             );
  420.  
  421.             var lightingDirection = [
  422.                 parseFloat(document.getElementById("lightDirectionX").value),
  423.                 parseFloat(document.getElementById("lightDirectionY").value),
  424.                 parseFloat(document.getElementById("lightDirectionZ").value)
  425.             ];
  426.             var adjustedLD = vec3.create();
  427.             vec3.normalize(lightingDirection, adjustedLD);
  428.             vec3.scale(adjustedLD, -1);
  429.             gl.uniform3fv(shaderProgram.lightingDirectionUniform, adjustedLD);
  430.  
  431.             gl.uniform3f(
  432.                 shaderProgram.directionalColorUniform,
  433.                 parseFloat(document.getElementById("directionalR").value),
  434.                 parseFloat(document.getElementById("directionalG").value),
  435.                 parseFloat(document.getElementById("directionalB").value)
  436.             );
  437.         }
  438.  
  439.         mat4.identity(mvMatrix);
  440.  
  441.        // mat4.translate(mvMatrix, [0, 0, -6]);
  442.         mat4.translate(mvMatrix, [0.0, 0.0, z]);
  443.  
  444.         mat4.multiply(mvMatrix, moonRotationMatrix);
  445.  
  446.         gl.bindBuffer(gl.ARRAY_BUFFER, moonVertexPositionBuffer);
  447.         gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, moonVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);
  448.  
  449.         gl.bindBuffer(gl.ARRAY_BUFFER, moonVertexColourBuffer);
  450.         gl.vertexAttribPointer(shaderProgram.vertexColorAttribute, moonVertexColourBuffer.itemSize, gl.FLOAT, false, 0, 0);
  451.  
  452.         gl.bindBuffer(gl.ARRAY_BUFFER, moonVertexNormalBuffer);
  453.         gl.vertexAttribPointer(shaderProgram.vertexNormalAttribute, moonVertexNormalBuffer.itemSize, gl.FLOAT, false, 0, 0);
  454.  
  455.         gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, moonVertexIndexBuffer);
  456.         setMatrixUniforms();
  457.         gl.drawElements(gl.TRIANGLES, moonVertexIndexBuffer.numItems, gl.UNSIGNED_SHORT, 0);
  458.     }
  459.  
  460.  
  461.     function tick() {
  462.         requestAnimFrame(tick);
  463.         drawScene();
  464.     }
  465.  
  466.  
  467.     function webGLStart() {
  468.         var canvas = document.getElementById("lesson11-canvas");
  469.         initGL(canvas);
  470.         initShaders();
  471.         initBuffers();
  472.  
  473.         gl.clearColor(0.0, 0.0, 0.0, 1.0);
  474.         gl.enable(gl.DEPTH_TEST);
  475.  
  476.         canvas.onmousedown = handleMouseDown;
  477.         document.onmouseup = handleMouseUp;
  478.         document.onmousemove = handleMouseMove;
  479.         canvas.addEventListener('DOMMouseScroll',handleMouseWheel, false);
  480.         canvas.addEventListener('mousewheel',handleMouseWheel, false);
  481.         tick();
  482.     }
  483.  
  484. </script>
  485.  
  486.  
  487. </head>
  488.  
  489.  
  490. <body onload="webGLStart();">
  491.     <a href="http://learningwebgl.com/blog/?p=1253">&lt;&lt; Back to Lesson 11</a><br>
  492.  
  493.     <canvas id="lesson11-canvas" style="border: none;" width="500" height="500"></canvas>
  494.     <br>
  495.  
  496.     <input type="checkbox" id="lighting" checked=""> Use lighting<br>
  497.     Spin the moon by dragging it with the mouse.
  498.     <br>
  499.  
  500.     <h2>Directional light:</h2>
  501.  
  502.     <table style="border: 0; padding: 10px;">
  503.         <tbody><tr>
  504.             <td><b>Direction:</b>
  505.             </td><td>X: <input type="text" id="lightDirectionX" value="-1.0">
  506.             </td><td>Y: <input type="text" id="lightDirectionY" value="-1.0">
  507.             </td><td>Z: <input type="text" id="lightDirectionZ" value="-1.0">
  508.         </td></tr>
  509.         <tr>
  510.             <td><b>Colour:</b>
  511.             </td><td>R: <input type="text" id="directionalR" value="0.8">
  512.             </td><td>G: <input type="text" id="directionalG" value="0.8">
  513.             </td><td>B: <input type="text" id="directionalB" value="0.8">
  514.         </td></tr>
  515.     </tbody></table>
  516.  
  517.  
  518.     <h2>Ambient light:</h2>
  519.  
  520.     <table style="border: 0; padding: 10px;">
  521.         <tbody><tr>
  522.             <td><b>Colour:</b>
  523.             </td><td>R: <input type="text" id="ambientR" value="0.2">
  524.             </td><td>G: <input type="text" id="ambientG" value="0.2">
  525.             </td><td>B: <input type="text" id="ambientB" value="0.2">
  526.         </td></tr>
  527.     </tbody></table>
  528.     <br>
  529.  
  530.     Moon texture courtesy of <a href="http://maps.jpl.nasa.gov/">the Jet Propulsion Laboratory</a>.
  531.     <br>
  532.     <br>
  533.  
  534.     <a href="http://learningwebgl.com/blog/?p=1253">&lt;&lt; Back to Lesson 11</a><br>
  535.  
  536.     <!-- Google Analytics stuff, please ignore - nothing to do with WebGL :-) -->
  537.     <script type="text/javascript">
  538.         var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
  539.         document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
  540.     </script><script src="./Learning WebGL — lesson 11_files/ga.js" type="text/javascript"></script>
  541.     <script type="text/javascript">
  542.         try {
  543.             var pageTracker = _gat._getTracker("UA-2240015-5");
  544.             pageTracker._trackPageview();
  545.         } catch(err) {
  546.         }
  547.     </script>
  548.  
  549.  
  550.  
  551.  
  552. </body></html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement