changeset 0:9285dae61395 draft

1st commit,just play sounds.
author e105711 <yomitan.ie.u-ryukyu.ac.jp>
date Wed, 25 Apr 2012 23:45:59 +0900
parents
children 4fd71be3fb0b
files webGL/img/mainmode.png webGL/img/mainmode.txt webGL/img/press.png webGL/img/press.txt webGL/img/press_.png webGL/img/press_.txt webGL/img/title.png webGL/img/title.txt webGL/img/title_.png webGL/img/title_.txt webGL/sound/BGM.wav webGL/sound/cymbal.wav webGL/sound/ftom.wav webGL/sound/hclose.wav webGL/sound/hopen.wav webGL/sound/kick.wav webGL/sound/snare.wav webGL/src/J3DI.js webGL/src/J3DIMath.js webGL/src/const.js webGL/src/f4xml.js webGL/src/jkl-parsexml.js webGL/src/keybord.js webGL/src/mainfunc.js webGL/src/sound.js webGL/test2.html webGL/xml/font_pushstart.xml webGL/xml/mainmode.xml webGL/xml/press.xml webGL/xml/title.xml
diffstat 30 files changed, 4957 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
Binary file webGL/img/mainmode.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webGL/img/mainmode.txt	Wed Apr 25 23:45:59 2012 +0900
@@ -0,0 +1,197 @@
+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
+kADH/wN2bjbTsOrFbgAAAABJRU5ErkJggg==
Binary file webGL/img/press.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webGL/img/press.txt	Wed Apr 25 23:45:59 2012 +0900
@@ -0,0 +1,206 @@
+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
+AElFTkSuQmCC
Binary file webGL/img/press_.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webGL/img/press_.txt	Wed Apr 25 23:45:59 2012 +0900
@@ -0,0 +1,215 @@
+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
Binary file webGL/img/title.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webGL/img/title.txt	Wed Apr 25 23:45:59 2012 +0900
@@ -0,0 +1,275 @@
+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
+YbPZsHjxYjEq4n1qrVaLfv36oV+/fsID2MYvNuL7E99Dq9WKSjCZTMIrmSXBAkui
+Ba1atUJSUhKSk5NhNBqRlJSEDRs2oKSkpN4bXALjS0xKRHJyckTxBXbIer1eXISg
+0WhgsViQkJCAU6dOwWq1Ci87vnGlpaUhJycH7dq1E/7HrVYr9uzZg+PHj4tLEELl
+h72yOZ1OtGnTBjk5OejQoYPw2FZWVoZt27bh3LlzcDgcfqP7poa9xCUnJwuvcADw
+6quvYufOnSgtLY3YaxKn+5FHHsHs2bPFRRFA6I5Aq9WKTkmj0SApKQmpqalo27Yt
+WrVqhY4dO9YrNy29ruOxfTU1fBsUK4Fu3bph5MiRGDJkCHJycmA2m+H1eqFSqVBT
+U4PPP/8c+/btw9///necPHlSzKTrUxS+E4rL1YXRaAQRCS90gTNYl8sVdlvxHbQB
+l9pAWloasrKycO211woFqFarYbfb8c033+DQoUOoqakR79Dr9REN6K6EHoiUqFiC
+NZU1dahgMpnom2++ISL/c5xERNXV1ZSenk6AvwUsW8xOnTqVqqqq6Oy5s1RVVSUs
+BEOll5+76aabaPfu3XXM/L1eL7311ltkMpnEu95/fxEREVVWVgb1axyuZSWX1fLl
+yxscn69l5NNPP01/+9vfaPXq1bRv3z4qLS2liooKqqqqEn7Gp0+fLuLgZzMzM2nx
+4sV+luy+uN1uKisroxdffJHatWtHAOpY/PL/U1JSaP78+X6epQLj2rt3L915553i
+iFBTW2yyFf78+fOJiIRMsGzt3buXrr32WvHbSK32w7GcBi4dZSouLqbTp09TeXk5
+VVZW+pV5fXLT0uuav+Oz4PHQvsLtCxtjTe1rQZ+VlUWFhYV+6WQHM4F9IdElvwxv
+vvlm2P7Mk5KSqG/fvnTvvffSc889F1QOvF4vlZWV1QkVFRX0448/EhHRb37zm7Dy
+qdVqRZo6depEjz76KO3bt6+Ow5zA91utVlq7di3dfffdlJycLOKq79RDU+qBt99+
+208PRBii05ldSWXM7yooKCAif3eB/PdDDz1URxC4MOfMmVPnOXa3yekuKSkhg8Eg
+KnbixInid16vl2w2m3BzyJXIXpG0Wm0dRyXcWJxOJ7lcLnFcYObMmfUKrEajoa1b
+tzY4Ps5Du3btRP6CEdhZsFBNnTpVNHKXy0WVlZVUXl5O5eXlVF1dTQ6Hw69jcLlc
+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
+AAAAAElFTkSuQmCC
Binary file webGL/img/title_.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webGL/img/title_.txt	Wed Apr 25 23:45:59 2012 +0900
@@ -0,0 +1,320 @@
+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
Binary file webGL/sound/BGM.wav has changed
Binary file webGL/sound/cymbal.wav has changed
Binary file webGL/sound/ftom.wav has changed
Binary file webGL/sound/hclose.wav has changed
Binary file webGL/sound/hopen.wav has changed
Binary file webGL/sound/kick.wav has changed
Binary file webGL/sound/snare.wav has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webGL/src/J3DI.js	Wed Apr 25 23:45:59 2012 +0900
@@ -0,0 +1,583 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+//
+// initWebGL
+//
+// Initialize the Canvas element with the passed name as a WebGL object and return the
+// WebGLRenderingContext.
+//
+// Load shaders with the passed names and create a program with them. Return this program
+// in the 'program' property of the returned context.
+//
+// For each string in the passed attribs array, bind an attrib with that name at that index.
+// Once the attribs are bound, link the program and then use it.
+//
+// Set the clear color to the passed array (4 values) and set the clear depth to the passed value.
+// Enable depth testing and blending with a blend func of (SRC_ALPHA, ONE_MINUS_SRC_ALPHA)
+//
+// A console function is added to the context: console(string). This can be replaced
+// by the caller. By default, it maps to the window.console() function on WebKit and to
+// an empty function on other browsers.
+//
+function initWebGL(canvasName, vshader, fshader, attribs, clearColor, clearDepth)
+{
+    var canvas = document.getElementById(canvasName);
+    var gl = canvas.getContext("experimental-webgl");
+    if (!gl) {
+        alert("No WebGL context found");
+        return null;
+    }
+
+    // Add a console
+    gl.console = ("console" in window) ? window.console : { log: function() { } };
+
+    // create our shaders
+    var vertexShader = loadShader(gl, vshader);
+    var fragmentShader = loadShader(gl, fshader);
+
+    if (!vertexShader || !fragmentShader)
+        return null;
+
+    // Create the program object
+    gl.program = gl.createProgram();
+
+    if (!gl.program)
+        return null;
+
+    // Attach our two shaders to the program
+    gl.attachShader (gl.program, vertexShader);
+    gl.attachShader (gl.program, fragmentShader);
+
+    // Bind attributes
+    for (var i = 0; i < attribs.length; ++i)
+        gl.bindAttribLocation (gl.program, i, attribs[i]);
+
+    // Link the program
+    gl.linkProgram(gl.program);
+
+    // Check the link status
+    var linked = gl.getProgramParameter(gl.program, gl.LINK_STATUS);
+    if (!linked) {
+        // something went wrong with the link
+        var error = gl.getProgramInfoLog (gl.program);
+        gl.console.log("Error in program linking:"+error);
+
+        gl.deleteProgram(gl.program);
+        gl.deleteProgram(fragmentShader);
+        gl.deleteProgram(vertexShader);
+
+        return null;
+    }
+
+    gl.useProgram(gl.program);
+
+    gl.clearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);
+    gl.clearDepth(clearDepth);
+
+    gl.enable(gl.DEPTH_TEST);
+    gl.enable(gl.BLEND);
+    gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
+
+    return gl;
+}
+
+//
+// loadShader
+//
+// 'shaderId' is the id of a <script> element containing the shader source string.
+// Load this shader and return the WebGLShader object corresponding to it.
+//
+function loadShader(ctx, shaderId)
+{
+    var shaderScript = document.getElementById(shaderId);
+    if (!shaderScript) {
+        ctx.console.log("*** Error: shader script '"+shaderId+"' not found");
+        return null;
+    }
+
+    if (shaderScript.type == "x-shader/x-vertex")
+        var shaderType = ctx.VERTEX_SHADER;
+    else if (shaderScript.type == "x-shader/x-fragment")
+        var shaderType = ctx.FRAGMENT_SHADER;
+    else {
+        ctx.console.log("*** Error: shader script '"+shaderId+"' of undefined type '"+shaderScript.type+"'");
+        return null;
+    }
+
+    // Create the shader object
+    var shader = ctx.createShader(shaderType);
+    if (shader == null) {
+        ctx.console.log("*** Error: unable to create shader '"+shaderId+"'");
+        return null;
+    }
+
+    // Load the shader source
+    ctx.shaderSource(shader, shaderScript.text);
+
+    // Compile the shader
+    ctx.compileShader(shader);
+
+    // Check the compile status
+    var compiled = ctx.getShaderParameter(shader, ctx.COMPILE_STATUS);
+    if (!compiled) {
+        // Something went wrong during compilation; get the error
+        var error = ctx.getShaderInfoLog(shader);
+        ctx.console.log("*** Error compiling shader '"+shaderId+"':"+error);
+        ctx.deleteShader(shader);
+        return null;
+    }
+
+    return shader;
+}
+
+//
+// makeBox
+//
+// Create a box with vertices, normals and texCoords. Create VBOs for each as well as the index array.
+// Return an object with the following properties:
+//
+//  normalObject        WebGLBuffer object for normals
+//  texCoordObject      WebGLBuffer object for texCoords
+//  vertexObject        WebGLBuffer object for vertices
+//  indexObject         WebGLBuffer object for indices
+//  numIndices          The number of indices in the indexObject
+//
+function makeBox(ctx)
+{
+    // box
+    //    v6----- v5
+    //   /|      /|
+    //  v1------v0|
+    //  | |     | |
+    //  | |v7---|-|v4
+    //  |/      |/
+    //  v2------v3
+    //
+    // vertex coords array
+    var vertices = new Float32Array(
+        [  1, 1, 1,  -1, 1, 1,  -1,-1, 1,   1,-1, 1,    // v0-v1-v2-v3 front
+           1, 1, 1,   1,-1, 1,   1,-1,-1,   1, 1,-1,    // v0-v3-v4-v5 right
+           1, 1, 1,   1, 1,-1,  -1, 1,-1,  -1, 1, 1,    // v0-v5-v6-v1 top
+          -1, 1, 1,  -1, 1,-1,  -1,-1,-1,  -1,-1, 1,    // v1-v6-v7-v2 left
+          -1,-1,-1,   1,-1,-1,   1,-1, 1,  -1,-1, 1,    // v7-v4-v3-v2 bottom
+           1,-1,-1,  -1,-1,-1,  -1, 1,-1,   1, 1,-1 ]   // v4-v7-v6-v5 back
+    );
+
+    // normal array
+    var normals = new Float32Array(
+        [  0, 0, 1,   0, 0, 1,   0, 0, 1,   0, 0, 1,     // v0-v1-v2-v3 front
+           1, 0, 0,   1, 0, 0,   1, 0, 0,   1, 0, 0,     // v0-v3-v4-v5 right
+           0, 1, 0,   0, 1, 0,   0, 1, 0,   0, 1, 0,     // v0-v5-v6-v1 top
+          -1, 0, 0,  -1, 0, 0,  -1, 0, 0,  -1, 0, 0,     // v1-v6-v7-v2 left
+           0,-1, 0,   0,-1, 0,   0,-1, 0,   0,-1, 0,     // v7-v4-v3-v2 bottom
+           0, 0,-1,   0, 0,-1,   0, 0,-1,   0, 0,-1 ]    // v4-v7-v6-v5 back
+       );
+
+
+    // texCoord array
+    var texCoords = new Float32Array(
+        [  1, 1,   0, 1,   0, 0,   1, 0,    // v0-v1-v2-v3 front
+           0, 1,   0, 0,   1, 0,   1, 1,    // v0-v3-v4-v5 right
+           1, 0,   1, 1,   0, 1,   0, 0,    // v0-v5-v6-v1 top
+           1, 1,   0, 1,   0, 0,   1, 0,    // v1-v6-v7-v2 left
+           0, 0,   1, 0,   1, 1,   0, 1,    // v7-v4-v3-v2 bottom
+           0, 0,   1, 0,   1, 1,   0, 1 ]   // v4-v7-v6-v5 back
+       );
+
+    // index array
+    var indices = new Uint8Array(
+        [  0, 1, 2,   0, 2, 3,    // front
+           4, 5, 6,   4, 6, 7,    // right
+           8, 9,10,   8,10,11,    // top
+          12,13,14,  12,14,15,    // left
+          16,17,18,  16,18,19,    // bottom
+          20,21,22,  20,22,23 ]   // back
+      );
+
+    var retval = { };
+
+    retval.normalObject = ctx.createBuffer();
+    ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.normalObject);
+    ctx.bufferData(ctx.ARRAY_BUFFER, normals, ctx.STATIC_DRAW);
+
+    retval.texCoordObject = ctx.createBuffer();
+    ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.texCoordObject);
+    ctx.bufferData(ctx.ARRAY_BUFFER, texCoords, ctx.STATIC_DRAW);
+
+    retval.vertexObject = ctx.createBuffer();
+    ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.vertexObject);
+    ctx.bufferData(ctx.ARRAY_BUFFER, vertices, ctx.STATIC_DRAW);
+
+    ctx.bindBuffer(ctx.ARRAY_BUFFER, null);
+
+    retval.indexObject = ctx.createBuffer();
+    ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, retval.indexObject);
+    ctx.bufferData(ctx.ELEMENT_ARRAY_BUFFER, indices, ctx.STATIC_DRAW);
+    ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, null);
+
+    retval.numIndices = indices.length;
+
+    return retval;
+}
+
+//
+// makeSphere
+//
+// Create a sphere with the passed number of latitude and longitude bands and the passed radius.
+// Sphere has vertices, normals and texCoords. Create VBOs for each as well as the index array.
+// Return an object with the following properties:
+//
+//  normalObject        WebGLBuffer object for normals
+//  texCoordObject      WebGLBuffer object for texCoords
+//  vertexObject        WebGLBuffer object for vertices
+//  indexObject         WebGLBuffer object for indices
+//  numIndices          The number of indices in the indexObject
+//
+function makeSphere(ctx, radius, lats, longs)
+{
+    var geometryData = [ ];
+    var normalData = [ ];
+    var texCoordData = [ ];
+    var indexData = [ ];
+
+    for (var latNumber = 0; latNumber <= lats; ++latNumber) {
+        for (var longNumber = 0; longNumber <= longs; ++longNumber) {
+            var theta = latNumber * Math.PI / lats;
+            var phi = longNumber * 2 * Math.PI / longs;
+            var sinTheta = Math.sin(theta);
+            var sinPhi = Math.sin(phi);
+            var cosTheta = Math.cos(theta);
+            var cosPhi = Math.cos(phi);
+
+            var x = cosPhi * sinTheta;
+            var y = cosTheta;
+            var z = sinPhi * sinTheta;
+            var u = 1-(longNumber/longs);
+            var v = latNumber/lats;
+
+            normalData.push(x);
+            normalData.push(y);
+            normalData.push(z);
+            texCoordData.push(u);
+            texCoordData.push(v);
+            geometryData.push(radius * x);
+            geometryData.push(radius * y);
+            geometryData.push(radius * z);
+        }
+    }
+
+    for (var latNumber = 0; latNumber < lats; ++latNumber) {
+        for (var longNumber = 0; longNumber < longs; ++longNumber) {
+            var first = (latNumber * (longs+1)) + longNumber;
+            var second = first + longs + 1;
+            indexData.push(first);
+            indexData.push(second);
+            indexData.push(first+1);
+
+            indexData.push(second);
+            indexData.push(second+1);
+            indexData.push(first+1);
+        }
+    }
+
+    var retval = { };
+
+    retval.normalObject = ctx.createBuffer();
+    ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.normalObject);
+    ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(normalData), ctx.STATIC_DRAW);
+
+    retval.texCoordObject = ctx.createBuffer();
+    ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.texCoordObject);
+    ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(texCoordData), ctx.STATIC_DRAW);
+
+    retval.vertexObject = ctx.createBuffer();
+    ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.vertexObject);
+    ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(geometryData), ctx.STATIC_DRAW);
+
+    retval.numIndices = indexData.length;
+    retval.indexObject = ctx.createBuffer();
+    ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, retval.indexObject);
+    ctx.bufferData(ctx.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexData), ctx.STREAM_DRAW);
+
+    return retval;
+}
+
+//
+// loadObj
+//
+// Load a .obj file from the passed URL. Return an object with a 'loaded' property set to false.
+// When the object load is complete, the 'loaded' property becomes true and the following
+// properties are set:
+//
+//  normalObject        WebGLBuffer object for normals
+//  texCoordObject      WebGLBuffer object for texCoords
+//  vertexObject        WebGLBuffer object for vertices
+//  indexObject         WebGLBuffer object for indices
+//  numIndices          The number of indices in the indexObject
+//
+function loadObj(ctx, url)
+{
+    var obj = { loaded : false };
+    obj.ctx = ctx;
+    var req = new XMLHttpRequest();
+    req.obj = obj;
+    req.onreadystatechange = function () { processLoadObj(req) };
+    req.open("GET", url, true);
+    req.send(null);
+    return obj;
+}
+
+function processLoadObj(req)
+{
+    req.obj.ctx.console.log("req="+req)
+    // only if req shows "complete"
+    if (req.readyState == 4) {
+        doLoadObj(req.obj, req.responseText);
+    }
+}
+
+function doLoadObj(obj, text)
+{
+    vertexArray = [ ];
+    normalArray = [ ];
+    textureArray = [ ];
+    indexArray = [ ];
+
+    var vertex = [ ];
+    var normal = [ ];
+    var texture = [ ];
+    var facemap = { };
+    var index = 0;
+
+    // This is a map which associates a range of indices with a name
+    // The name comes from the 'g' tag (of the form "g NAME"). Indices
+    // are part of one group until another 'g' tag is seen. If any indices
+    // come before a 'g' tag, it is given the group name "_unnamed"
+    // 'group' is an object whose property names are the group name and
+    // whose value is a 2 element array with [<first index>, <num indices>]
+    var groups = { };
+    var currentGroup = [-1, 0];
+    groups["_unnamed"] = currentGroup;
+
+    var lines = text.split("\n");
+    for (var lineIndex in lines) {
+        var line = lines[lineIndex].replace(/[ \t]+/g, " ").replace(/\s\s*$/, "");
+
+        // ignore comments
+        if (line[0] == "#")
+            continue;
+
+        var array = line.split(" ");
+        if (array[0] == "g") {
+            // new group
+            currentGroup = [indexArray.length, 0];
+            groups[array[1]] = currentGroup;
+        }
+        else if (array[0] == "v") {
+            // vertex
+            vertex.push(parseFloat(array[1]));
+            vertex.push(parseFloat(array[2]));
+            vertex.push(parseFloat(array[3]));
+        }
+        else if (array[0] == "vt") {
+            // normal
+            texture.push(parseFloat(array[1]));
+            texture.push(parseFloat(array[2]));
+        }
+        else if (array[0] == "vn") {
+            // normal
+            normal.push(parseFloat(array[1]));
+            normal.push(parseFloat(array[2]));
+            normal.push(parseFloat(array[3]));
+        }
+        else if (array[0] == "f") {
+            // face
+            if (array.length != 4) {
+                obj.ctx.console.log("*** Error: face '"+line+"' not handled");
+                continue;
+            }
+
+            for (var i = 1; i < 4; ++i) {
+                if (!(array[i] in facemap)) {
+                    // add a new entry to the map and arrays
+                    var f = array[i].split("/");
+                    var vtx, nor, tex;
+
+                    if (f.length == 1) {
+                        vtx = parseInt(f[0]) - 1;
+                        nor = vtx;
+                        tex = vtx;
+                    }
+                    else if (f.length = 3) {
+                        vtx = parseInt(f[0]) - 1;
+                        tex = parseInt(f[1]) - 1;
+                        nor = parseInt(f[2]) - 1;
+                    }
+                    else {
+                        obj.ctx.console.log("*** Error: did not understand face '"+array[i]+"'");
+                        return null;
+                    }
+
+                    // do the vertices
+                    var x = 0;
+                    var y = 0;
+                    var z = 0;
+                    if (vtx * 3 + 2 < vertex.length) {
+                        x = vertex[vtx*3];
+                        y = vertex[vtx*3+1];
+                        z = vertex[vtx*3+2];
+                    }
+                    vertexArray.push(x);
+                    vertexArray.push(y);
+                    vertexArray.push(z);
+
+                    // do the textures
+                    x = 0;
+                    y = 0;
+                    if (tex * 2 + 1 < texture.length) {
+                        x = texture[tex*2];
+                        y = texture[tex*2+1];
+                    }
+                    textureArray.push(x);
+                    textureArray.push(y);
+
+                    // do the normals
+                    x = 0;
+                    y = 0;
+                    z = 1;
+                    if (nor * 3 + 2 < normal.length) {
+                        x = normal[nor*3];
+                        y = normal[nor*3+1];
+                        z = normal[nor*3+2];
+                    }
+                    normalArray.push(x);
+                    normalArray.push(y);
+                    normalArray.push(z);
+
+                    facemap[array[i]] = index++;
+                }
+
+                indexArray.push(facemap[array[i]]);
+                currentGroup[1]++;
+            }
+        }
+    }
+
+    // set the VBOs
+    obj.normalObject = obj.ctx.createBuffer();
+    obj.ctx.bindBuffer(obj.ctx.ARRAY_BUFFER, obj.normalObject);
+    obj.ctx.bufferData(obj.ctx.ARRAY_BUFFER, new Float32Array(normalArray), obj.ctx.STATIC_DRAW);
+
+    obj.texCoordObject = obj.ctx.createBuffer();
+    obj.ctx.bindBuffer(obj.ctx.ARRAY_BUFFER, obj.texCoordObject);
+    obj.ctx.bufferData(obj.ctx.ARRAY_BUFFER, new Float32Array(textureArray), obj.ctx.STATIC_DRAW);
+
+    obj.vertexObject = obj.ctx.createBuffer();
+    obj.ctx.bindBuffer(obj.ctx.ARRAY_BUFFER, obj.vertexObject);
+    obj.ctx.bufferData(obj.ctx.ARRAY_BUFFER, new Float32Array(vertexArray), obj.ctx.STATIC_DRAW);
+
+    obj.numIndices = indexArray.length;
+    obj.indexObject = obj.ctx.createBuffer();
+    obj.ctx.bindBuffer(obj.ctx.ELEMENT_ARRAY_BUFFER, obj.indexObject);
+    obj.ctx.bufferData(obj.ctx.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexArray), obj.ctx.STREAM_DRAW);
+
+    obj.groups = groups;
+
+    obj.loaded = true;
+}
+
+//
+// loadImageTexture
+//
+// Load the image at the passed url, place it in a new WebGLTexture object and return the WebGLTexture.
+//
+function loadImageTexture(ctx, url)
+{
+    var texture = ctx.createTexture();
+    texture.image = new Image();
+    texture.image.onload = function() { doLoadImageTexture(ctx, texture.image, texture) }
+    texture.image.src = url;
+    return texture;
+}
+
+function doLoadImageTexture(ctx, image, texture)
+{
+    ctx.bindTexture(ctx.TEXTURE_2D, texture);
+    ctx.texImage2D(
+        ctx.TEXTURE_2D, 0, ctx.RGBA, ctx.RGBA, ctx.UNSIGNED_BYTE, image);
+    ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MAG_FILTER, ctx.LINEAR);
+    ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MIN_FILTER, ctx.LINEAR);
+    ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_WRAP_S, ctx.CLAMP_TO_EDGE);
+    ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_WRAP_T, ctx.CLAMP_TO_EDGE);
+    //ctx.generateMipmap(ctx.TEXTURE_2D)
+    ctx.bindTexture(ctx.TEXTURE_2D, null);
+}
+
+//
+// Framerate object
+//
+// This object keeps track of framerate and displays it as the innerHTML text of the
+// HTML element with the passed id. Once created you call snapshot at the end
+// of every rendering cycle. Every 500ms the framerate is updated in the HTML element.
+//
+Framerate = function(id)
+{
+    this.numFramerates = 10;
+    this.framerateUpdateInterval = 500;
+    this.id = id;
+
+    this.renderTime = -1;
+    this.framerates = [ ];
+    self = this;
+    var fr = function() { self.updateFramerate() }
+    setInterval(fr, this.framerateUpdateInterval);
+}
+
+Framerate.prototype.updateFramerate = function()
+{
+    var tot = 0;
+    for (var i = 0; i < this.framerates.length; ++i)
+        tot += this.framerates[i];
+
+    var framerate = tot / this.framerates.length;
+    framerate = Math.round(framerate);
+    document.getElementById(this.id).innerHTML = "Framerate:"+framerate+"fps";
+}
+
+Framerate.prototype.snapshot = function()
+{
+    if (this.renderTime < 0)
+        this.renderTime = new Date().getTime();
+    else {
+        var newTime = new Date().getTime();
+        var t = newTime - this.renderTime;
+        var framerate = 1000/t;
+        this.framerates.push(framerate);
+        while (this.framerates.length > this.numFramerates)
+            this.framerates.shift();
+        this.renderTime = newTime;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webGL/src/J3DIMath.js	Wed Apr 25 23:45:59 2012 +0900
@@ -0,0 +1,1065 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+ // J3DI (Jedi) - A support library for WebGL.
+
+/*
+    J3DI Math Classes. Currently includes:
+
+        J3DIMatrix4 - A 4x4 Matrix
+*/
+
+/*
+    J3DIMatrix4 class
+
+    This class implements a 4x4 matrix. It has functions which duplicate the
+    functionality of the OpenGL matrix stack and glut functions. On browsers
+    that support it, CSSMatrix is used to accelerate operations.
+
+    IDL:
+
+    [
+        Constructor(in J3DIMatrix4 matrix),                 // copy passed matrix into new J3DIMatrix4
+        Constructor(in sequence<float> array)               // create new J3DIMatrix4 with 16 floats (row major)
+        Constructor()                                       // create new J3DIMatrix4 with identity matrix
+    ]
+    interface J3DIMatrix4 {
+        void load(in J3DIMatrix4 matrix);                   // copy the values from the passed matrix
+        void load(in sequence<float> array);                // copy 16 floats into the matrix
+        sequence<float> getAsArray();                       // return the matrix as an array of 16 floats
+        Float32Array getAsFloat32Array();             // return the matrix as a Float32Array with 16 values
+        void setUniform(in WebGLRenderingContext ctx,       // Send the matrix to the passed uniform location in the passed context
+                        in WebGLUniformLocation loc,
+                        in boolean transpose);
+        void makeIdentity();                                // replace the matrix with identity
+        void transpose();                                   // replace the matrix with its transpose
+        void invert();                                      // replace the matrix with its inverse
+
+        void translate(in float x, in float y, in float z); // multiply the matrix by passed translation values on the right
+        void translate(in J3DVector3 v);                    // multiply the matrix by passed translation values on the right
+        void scale(in float x, in float y, in float z);     // multiply the matrix by passed scale values on the right
+        void scale(in J3DVector3 v);                        // multiply the matrix by passed scale values on the right
+        void rotate(in float angle,                         // multiply the matrix by passed rotation values on the right
+                    in float x, in float y, in float z);    // (angle is in degrees)
+        void rotate(in float angle, in J3DVector3 v);       // multiply the matrix by passed rotation values on the right
+                                                            // (angle is in degrees)
+        void multiply(in CanvasMatrix matrix);              // multiply the matrix by the passed matrix on the right
+        void divide(in float divisor);                      // divide the matrix by the passed divisor
+        void ortho(in float left, in float right,           // multiply the matrix by the passed ortho values on the right
+                   in float bottom, in float top,
+                   in float near, in float far);
+        void frustum(in float left, in float right,         // multiply the matrix by the passed frustum values on the right
+                     in float bottom, in float top,
+                     in float near, in float far);
+        void perspective(in float fovy, in float aspect,    // multiply the matrix by the passed perspective values on the right
+                         in float zNear, in float zFar);
+        void lookat(in J3DVector3 eye,                      // multiply the matrix by the passed lookat
+                in J3DVector3 center,  in J3DVector3 up);   // values on the right
+         bool decompose(in J3DVector3 translate,            // decompose the matrix into the passed vector
+                        in J3DVector3 rotate,
+                        in J3DVector3 scale,
+                        in J3DVector3 skew,
+                        in sequence<float> perspective);
+    }
+
+    [
+        Constructor(in J3DVector3 vector),                  // copy passed vector into new J3DVector3
+        Constructor(in sequence<float> array)               // create new J3DVector3 with 3 floats from array
+        Constructor(in float x, in float y, in float z)     // create new J3DVector3 with 3 floats
+        Constructor()                                       // create new J3DVector3 with (0,0,0)
+    ]
+    interface J3DVector3 {
+        void load(in J3DVector3 vector);                    // copy the values from the passed vector
+        void load(in sequence<float> array);                // copy 3 floats into the vector from array
+        void load(in float x, in float y, in float z);      // copy 3 floats into the vector
+        sequence<float> getAsArray();                       // return the vector as an array of 3 floats
+        Float32Array getAsFloat32Array();             // return the matrix as a Float32Array with 16 values
+        void multMatrix(in J3DIMatrix4 matrix);             // multiply the vector by the passed matrix (on the right)
+        float vectorLength();                               // return the length of the vector
+        float dot();                                        // return the dot product of the vector
+        void cross(in J3DVector3 v);                        // replace the vector with vector x v
+        void divide(in float divisor);                      // divide the vector by the passed divisor
+    }
+*/
+
+J3DIHasCSSMatrix = false;
+J3DIHasCSSMatrixCopy = false;
+/*
+if ("WebKitCSSMatrix" in window && ("media" in window && window.media.matchMedium("(-webkit-transform-3d)")) ||
+                                   ("styleMedia" in window && window.styleMedia.matchMedium("(-webkit-transform-3d)"))) {
+    J3DIHasCSSMatrix = true;
+    if ("copy" in WebKitCSSMatrix.prototype)
+        J3DIHasCSSMatrixCopy = true;
+}
+*/
+
+//  console.log("J3DIHasCSSMatrix="+J3DIHasCSSMatrix);
+//  console.log("J3DIHasCSSMatrixCopy="+J3DIHasCSSMatrixCopy);
+
+//
+// J3DIMatrix4
+//
+J3DIMatrix4 = function(m)
+{
+    if (J3DIHasCSSMatrix)
+        this.$matrix = new WebKitCSSMatrix;
+    else
+        this.$matrix = new Object;
+
+    if (typeof m == 'object') {
+        if ("length" in m && m.length >= 16) {
+            this.load(m);
+            return;
+        }
+        else if (m instanceof J3DIMatrix4) {
+            this.load(m);
+            return;
+        }
+    }
+    this.makeIdentity();
+}
+
+J3DIMatrix4.prototype.load = function()
+{
+    if (arguments.length == 1 && typeof arguments[0] == 'object') {
+        var matrix;
+
+        if (arguments[0] instanceof J3DIMatrix4) {
+            matrix = arguments[0].$matrix;
+
+            this.$matrix.m11 = matrix.m11;
+            this.$matrix.m12 = matrix.m12;
+            this.$matrix.m13 = matrix.m13;
+            this.$matrix.m14 = matrix.m14;
+
+            this.$matrix.m21 = matrix.m21;
+            this.$matrix.m22 = matrix.m22;
+            this.$matrix.m23 = matrix.m23;
+            this.$matrix.m24 = matrix.m24;
+
+            this.$matrix.m31 = matrix.m31;
+            this.$matrix.m32 = matrix.m32;
+            this.$matrix.m33 = matrix.m33;
+            this.$matrix.m34 = matrix.m34;
+
+            this.$matrix.m41 = matrix.m41;
+            this.$matrix.m42 = matrix.m42;
+            this.$matrix.m43 = matrix.m43;
+            this.$matrix.m44 = matrix.m44;
+            return;
+        }
+        else
+            matrix = arguments[0];
+
+        if ("length" in matrix && matrix.length >= 16) {
+            this.$matrix.m11 = matrix[0];
+            this.$matrix.m12 = matrix[1];
+            this.$matrix.m13 = matrix[2];
+            this.$matrix.m14 = matrix[3];
+
+            this.$matrix.m21 = matrix[4];
+            this.$matrix.m22 = matrix[5];
+            this.$matrix.m23 = matrix[6];
+            this.$matrix.m24 = matrix[7];
+
+            this.$matrix.m31 = matrix[8];
+            this.$matrix.m32 = matrix[9];
+            this.$matrix.m33 = matrix[10];
+            this.$matrix.m34 = matrix[11];
+
+            this.$matrix.m41 = matrix[12];
+            this.$matrix.m42 = matrix[13];
+            this.$matrix.m43 = matrix[14];
+            this.$matrix.m44 = matrix[15];
+            return;
+        }
+    }
+
+    this.makeIdentity();
+}
+
+J3DIMatrix4.prototype.getAsArray = function()
+{
+    return [
+        this.$matrix.m11, this.$matrix.m12, this.$matrix.m13, this.$matrix.m14,
+        this.$matrix.m21, this.$matrix.m22, this.$matrix.m23, this.$matrix.m24,
+        this.$matrix.m31, this.$matrix.m32, this.$matrix.m33, this.$matrix.m34,
+        this.$matrix.m41, this.$matrix.m42, this.$matrix.m43, this.$matrix.m44
+    ];
+}
+
+J3DIMatrix4.prototype.getAsFloat32Array = function()
+{
+    if (J3DIHasCSSMatrixCopy) {
+        var array = new Float32Array(16);
+        this.$matrix.copy(array);
+        return array;
+    }
+    return new Float32Array(this.getAsArray());
+}
+
+J3DIMatrix4.prototype.setUniform = function(ctx, loc, transpose)
+{
+    if (J3DIMatrix4.setUniformArray == undefined) {
+        J3DIMatrix4.setUniformWebGLArray = new Float32Array(16);
+        J3DIMatrix4.setUniformArray = new Array(16);
+    }
+
+    if (J3DIHasCSSMatrixCopy)
+        this.$matrix.copy(J3DIMatrix4.setUniformWebGLArray);
+    else {
+        J3DIMatrix4.setUniformArray[0] = this.$matrix.m11;
+        J3DIMatrix4.setUniformArray[1] = this.$matrix.m12;
+        J3DIMatrix4.setUniformArray[2] = this.$matrix.m13;
+        J3DIMatrix4.setUniformArray[3] = this.$matrix.m14;
+        J3DIMatrix4.setUniformArray[4] = this.$matrix.m21;
+        J3DIMatrix4.setUniformArray[5] = this.$matrix.m22;
+        J3DIMatrix4.setUniformArray[6] = this.$matrix.m23;
+        J3DIMatrix4.setUniformArray[7] = this.$matrix.m24;
+        J3DIMatrix4.setUniformArray[8] = this.$matrix.m31;
+        J3DIMatrix4.setUniformArray[9] = this.$matrix.m32;
+        J3DIMatrix4.setUniformArray[10] = this.$matrix.m33;
+        J3DIMatrix4.setUniformArray[11] = this.$matrix.m34;
+        J3DIMatrix4.setUniformArray[12] = this.$matrix.m41;
+        J3DIMatrix4.setUniformArray[13] = this.$matrix.m42;
+        J3DIMatrix4.setUniformArray[14] = this.$matrix.m43;
+        J3DIMatrix4.setUniformArray[15] = this.$matrix.m44;
+
+        J3DIMatrix4.setUniformWebGLArray.set(J3DIMatrix4.setUniformArray);
+    }
+
+    ctx.uniformMatrix4fv(loc, transpose, J3DIMatrix4.setUniformWebGLArray);
+}
+
+J3DIMatrix4.prototype.makeIdentity = function()
+{
+    this.$matrix.m11 = 1;
+    this.$matrix.m12 = 0;
+    this.$matrix.m13 = 0;
+    this.$matrix.m14 = 0;
+
+    this.$matrix.m21 = 0;
+    this.$matrix.m22 = 1;
+    this.$matrix.m23 = 0;
+    this.$matrix.m24 = 0;
+
+    this.$matrix.m31 = 0;
+    this.$matrix.m32 = 0;
+    this.$matrix.m33 = 1;
+    this.$matrix.m34 = 0;
+
+    this.$matrix.m41 = 0;
+    this.$matrix.m42 = 0;
+    this.$matrix.m43 = 0;
+    this.$matrix.m44 = 1;
+}
+
+J3DIMatrix4.prototype.transpose = function()
+{
+    var tmp = this.$matrix.m12;
+    this.$matrix.m12 = this.$matrix.m21;
+    this.$matrix.m21 = tmp;
+
+    tmp = this.$matrix.m13;
+    this.$matrix.m13 = this.$matrix.m31;
+    this.$matrix.m31 = tmp;
+
+    tmp = this.$matrix.m14;
+    this.$matrix.m14 = this.$matrix.m41;
+    this.$matrix.m41 = tmp;
+
+    tmp = this.$matrix.m23;
+    this.$matrix.m23 = this.$matrix.m32;
+    this.$matrix.m32 = tmp;
+
+    tmp = this.$matrix.m24;
+    this.$matrix.m24 = this.$matrix.m42;
+    this.$matrix.m42 = tmp;
+
+    tmp = this.$matrix.m34;
+    this.$matrix.m34 = this.$matrix.m43;
+    this.$matrix.m43 = tmp;
+}
+
+J3DIMatrix4.prototype.invert = function()
+{
+    if (J3DIHasCSSMatrix) {
+        this.$matrix = this.$matrix.inverse();
+        return;
+    }
+
+    // Calculate the 4x4 determinant
+    // If the determinant is zero,
+    // then the inverse matrix is not unique.
+    var det = this._determinant4x4();
+
+    if (Math.abs(det) < 1e-8)
+        return null;
+
+    this._makeAdjoint();
+
+    // Scale the adjoint matrix to get the inverse
+    this.$matrix.m11 /= det;
+    this.$matrix.m12 /= det;
+    this.$matrix.m13 /= det;
+    this.$matrix.m14 /= det;
+
+    this.$matrix.m21 /= det;
+    this.$matrix.m22 /= det;
+    this.$matrix.m23 /= det;
+    this.$matrix.m24 /= det;
+
+    this.$matrix.m31 /= det;
+    this.$matrix.m32 /= det;
+    this.$matrix.m33 /= det;
+    this.$matrix.m34 /= det;
+
+    this.$matrix.m41 /= det;
+    this.$matrix.m42 /= det;
+    this.$matrix.m43 /= det;
+    this.$matrix.m44 /= det;
+}
+
+J3DIMatrix4.prototype.translate = function(x,y,z)
+{
+    if (typeof x == 'object' && "length" in x) {
+        var t = x;
+        x = t[0];
+        y = t[1];
+        z = t[2];
+    }
+    else {
+        if (x == undefined)
+            x = 0;
+        if (y == undefined)
+            y = 0;
+        if (z == undefined)
+            z = 0;
+    }
+
+    if (J3DIHasCSSMatrix) {
+        this.$matrix = this.$matrix.translate(x, y, z);
+        return;
+    }
+
+    var matrix = new J3DIMatrix4();
+    matrix.$matrix.m41 = x;
+    matrix.$matrix.m42 = y;
+    matrix.$matrix.m43 = z;
+
+    this.multiply(matrix);
+}
+
+J3DIMatrix4.prototype.scale = function(x,y,z)
+{
+    if (typeof x == 'object' && "length" in x) {
+        var t = x;
+        x = t[0];
+        y = t[1];
+        z = t[2];
+    }
+    else {
+        if (x == undefined)
+            x = 1;
+        if (z == undefined) {
+            if (y == undefined) {
+                y = x;
+                z = x;
+            }
+            else
+                z = 1;
+        }
+        else if (y == undefined)
+            y = x;
+    }
+
+    if (J3DIHasCSSMatrix) {
+        this.$matrix = this.$matrix.scale(x, y, z);
+        return;
+    }
+
+    var matrix = new J3DIMatrix4();
+    matrix.$matrix.m11 = x;
+    matrix.$matrix.m22 = y;
+    matrix.$matrix.m33 = z;
+
+    this.multiply(matrix);
+}
+
+J3DIMatrix4.prototype.rotate = function(angle,x,y,z)
+{
+    // Forms are (angle, x,y,z), (angle,vector), (angleX, angleY, angleZ), (angle)
+    if (typeof x == 'object' && "length" in x) {
+        var t = x;
+        x = t[0];
+        y = t[1];
+        z = t[2];
+    }
+    else {
+        if (arguments.length == 1) {
+            x = 0;
+            y = 0;
+            z = 1;
+        }
+        else if (arguments.length == 3) {
+            this.rotate(angle, 1,0,0); // about X axis
+            this.rotate(x, 0,1,0); // about Y axis
+            this.rotate(y, 0,0,1); // about Z axis
+            return;
+        }
+    }
+
+    if (J3DIHasCSSMatrix) {
+        this.$matrix = this.$matrix.rotateAxisAngle(x, y, z, angle);
+        return;
+    }
+
+    // angles are in degrees. Switch to radians
+    angle = angle / 180 * Math.PI;
+
+    angle /= 2;
+    var sinA = Math.sin(angle);
+    var cosA = Math.cos(angle);
+    var sinA2 = sinA * sinA;
+
+    // normalize
+    var len = Math.sqrt(x * x + y * y + z * z);
+    if (len == 0) {
+        // bad vector, just use something reasonable
+        x = 0;
+        y = 0;
+        z = 1;
+    } else if (len != 1) {
+        x /= len;
+        y /= len;
+        z /= len;
+    }
+
+    var mat = new J3DIMatrix4();
+
+    // optimize case where axis is along major axis
+    if (x == 1 && y == 0 && z == 0) {
+        mat.$matrix.m11 = 1;
+        mat.$matrix.m12 = 0;
+        mat.$matrix.m13 = 0;
+        mat.$matrix.m21 = 0;
+        mat.$matrix.m22 = 1 - 2 * sinA2;
+        mat.$matrix.m23 = 2 * sinA * cosA;
+        mat.$matrix.m31 = 0;
+        mat.$matrix.m32 = -2 * sinA * cosA;
+        mat.$matrix.m33 = 1 - 2 * sinA2;
+        mat.$matrix.m14 = mat.$matrix.m24 = mat.$matrix.m34 = 0;
+        mat.$matrix.m41 = mat.$matrix.m42 = mat.$matrix.m43 = 0;
+        mat.$matrix.m44 = 1;
+    } else if (x == 0 && y == 1 && z == 0) {
+        mat.$matrix.m11 = 1 - 2 * sinA2;
+        mat.$matrix.m12 = 0;
+        mat.$matrix.m13 = -2 * sinA * cosA;
+        mat.$matrix.m21 = 0;
+        mat.$matrix.m22 = 1;
+        mat.$matrix.m23 = 0;
+        mat.$matrix.m31 = 2 * sinA * cosA;
+        mat.$matrix.m32 = 0;
+        mat.$matrix.m33 = 1 - 2 * sinA2;
+        mat.$matrix.m14 = mat.$matrix.m24 = mat.$matrix.m34 = 0;
+        mat.$matrix.m41 = mat.$matrix.m42 = mat.$matrix.m43 = 0;
+        mat.$matrix.m44 = 1;
+    } else if (x == 0 && y == 0 && z == 1) {
+        mat.$matrix.m11 = 1 - 2 * sinA2;
+        mat.$matrix.m12 = 2 * sinA * cosA;
+        mat.$matrix.m13 = 0;
+        mat.$matrix.m21 = -2 * sinA * cosA;
+        mat.$matrix.m22 = 1 - 2 * sinA2;
+        mat.$matrix.m23 = 0;
+        mat.$matrix.m31 = 0;
+        mat.$matrix.m32 = 0;
+        mat.$matrix.m33 = 1;
+        mat.$matrix.m14 = mat.$matrix.m24 = mat.$matrix.m34 = 0;
+        mat.$matrix.m41 = mat.$matrix.m42 = mat.$matrix.m43 = 0;
+        mat.$matrix.m44 = 1;
+    } else {
+        var x2 = x*x;
+        var y2 = y*y;
+        var z2 = z*z;
+
+        mat.$matrix.m11 = 1 - 2 * (y2 + z2) * sinA2;
+        mat.$matrix.m12 = 2 * (x * y * sinA2 + z * sinA * cosA);
+        mat.$matrix.m13 = 2 * (x * z * sinA2 - y * sinA * cosA);
+        mat.$matrix.m21 = 2 * (y * x * sinA2 - z * sinA * cosA);
+        mat.$matrix.m22 = 1 - 2 * (z2 + x2) * sinA2;
+        mat.$matrix.m23 = 2 * (y * z * sinA2 + x * sinA * cosA);
+        mat.$matrix.m31 = 2 * (z * x * sinA2 + y * sinA * cosA);
+        mat.$matrix.m32 = 2 * (z * y * sinA2 - x * sinA * cosA);
+        mat.$matrix.m33 = 1 - 2 * (x2 + y2) * sinA2;
+        mat.$matrix.m14 = mat.$matrix.m24 = mat.$matrix.m34 = 0;
+        mat.$matrix.m41 = mat.$matrix.m42 = mat.$matrix.m43 = 0;
+        mat.$matrix.m44 = 1;
+    }
+    this.multiply(mat);
+}
+
+J3DIMatrix4.prototype.multiply = function(mat)
+{
+    if (J3DIHasCSSMatrix) {
+        this.$matrix = this.$matrix.multiply(mat.$matrix);
+        return;
+    }
+
+    var m11 = (mat.$matrix.m11 * this.$matrix.m11 + mat.$matrix.m12 * this.$matrix.m21
+               + mat.$matrix.m13 * this.$matrix.m31 + mat.$matrix.m14 * this.$matrix.m41);
+    var m12 = (mat.$matrix.m11 * this.$matrix.m12 + mat.$matrix.m12 * this.$matrix.m22
+               + mat.$matrix.m13 * this.$matrix.m32 + mat.$matrix.m14 * this.$matrix.m42);
+    var m13 = (mat.$matrix.m11 * this.$matrix.m13 + mat.$matrix.m12 * this.$matrix.m23
+               + mat.$matrix.m13 * this.$matrix.m33 + mat.$matrix.m14 * this.$matrix.m43);
+    var m14 = (mat.$matrix.m11 * this.$matrix.m14 + mat.$matrix.m12 * this.$matrix.m24
+               + mat.$matrix.m13 * this.$matrix.m34 + mat.$matrix.m14 * this.$matrix.m44);
+
+    var m21 = (mat.$matrix.m21 * this.$matrix.m11 + mat.$matrix.m22 * this.$matrix.m21
+               + mat.$matrix.m23 * this.$matrix.m31 + mat.$matrix.m24 * this.$matrix.m41);
+    var m22 = (mat.$matrix.m21 * this.$matrix.m12 + mat.$matrix.m22 * this.$matrix.m22
+               + mat.$matrix.m23 * this.$matrix.m32 + mat.$matrix.m24 * this.$matrix.m42);
+    var m23 = (mat.$matrix.m21 * this.$matrix.m13 + mat.$matrix.m22 * this.$matrix.m23
+               + mat.$matrix.m23 * this.$matrix.m33 + mat.$matrix.m24 * this.$matrix.m43);
+    var m24 = (mat.$matrix.m21 * this.$matrix.m14 + mat.$matrix.m22 * this.$matrix.m24
+               + mat.$matrix.m23 * this.$matrix.m34 + mat.$matrix.m24 * this.$matrix.m44);
+
+    var m31 = (mat.$matrix.m31 * this.$matrix.m11 + mat.$matrix.m32 * this.$matrix.m21
+               + mat.$matrix.m33 * this.$matrix.m31 + mat.$matrix.m34 * this.$matrix.m41);
+    var m32 = (mat.$matrix.m31 * this.$matrix.m12 + mat.$matrix.m32 * this.$matrix.m22
+               + mat.$matrix.m33 * this.$matrix.m32 + mat.$matrix.m34 * this.$matrix.m42);
+    var m33 = (mat.$matrix.m31 * this.$matrix.m13 + mat.$matrix.m32 * this.$matrix.m23
+               + mat.$matrix.m33 * this.$matrix.m33 + mat.$matrix.m34 * this.$matrix.m43);
+    var m34 = (mat.$matrix.m31 * this.$matrix.m14 + mat.$matrix.m32 * this.$matrix.m24
+               + mat.$matrix.m33 * this.$matrix.m34 + mat.$matrix.m34 * this.$matrix.m44);
+
+    var m41 = (mat.$matrix.m41 * this.$matrix.m11 + mat.$matrix.m42 * this.$matrix.m21
+               + mat.$matrix.m43 * this.$matrix.m31 + mat.$matrix.m44 * this.$matrix.m41);
+    var m42 = (mat.$matrix.m41 * this.$matrix.m12 + mat.$matrix.m42 * this.$matrix.m22
+               + mat.$matrix.m43 * this.$matrix.m32 + mat.$matrix.m44 * this.$matrix.m42);
+    var m43 = (mat.$matrix.m41 * this.$matrix.m13 + mat.$matrix.m42 * this.$matrix.m23
+               + mat.$matrix.m43 * this.$matrix.m33 + mat.$matrix.m44 * this.$matrix.m43);
+    var m44 = (mat.$matrix.m41 * this.$matrix.m14 + mat.$matrix.m42 * this.$matrix.m24
+               + mat.$matrix.m43 * this.$matrix.m34 + mat.$matrix.m44 * this.$matrix.m44);
+
+    this.$matrix.m11 = m11;
+    this.$matrix.m12 = m12;
+    this.$matrix.m13 = m13;
+    this.$matrix.m14 = m14;
+
+    this.$matrix.m21 = m21;
+    this.$matrix.m22 = m22;
+    this.$matrix.m23 = m23;
+    this.$matrix.m24 = m24;
+
+    this.$matrix.m31 = m31;
+    this.$matrix.m32 = m32;
+    this.$matrix.m33 = m33;
+    this.$matrix.m34 = m34;
+
+    this.$matrix.m41 = m41;
+    this.$matrix.m42 = m42;
+    this.$matrix.m43 = m43;
+    this.$matrix.m44 = m44;
+}
+
+J3DIMatrix4.prototype.divide = function(divisor)
+{
+    this.$matrix.m11 /= divisor;
+    this.$matrix.m12 /= divisor;
+    this.$matrix.m13 /= divisor;
+    this.$matrix.m14 /= divisor;
+
+    this.$matrix.m21 /= divisor;
+    this.$matrix.m22 /= divisor;
+    this.$matrix.m23 /= divisor;
+    this.$matrix.m24 /= divisor;
+
+    this.$matrix.m31 /= divisor;
+    this.$matrix.m32 /= divisor;
+    this.$matrix.m33 /= divisor;
+    this.$matrix.m34 /= divisor;
+
+    this.$matrix.m41 /= divisor;
+    this.$matrix.m42 /= divisor;
+    this.$matrix.m43 /= divisor;
+    this.$matrix.m44 /= divisor;
+
+}
+
+J3DIMatrix4.prototype.ortho = function(left, right, bottom, top, near, far)
+{
+    var tx = (left + right) / (left - right);
+    var ty = (top + bottom) / (top - bottom);
+    var tz = (far + near) / (far - near);
+
+    var matrix = new J3DIMatrix4();
+    matrix.$matrix.m11 = 2 / (left - right);
+    matrix.$matrix.m12 = 0;
+    matrix.$matrix.m13 = 0;
+    matrix.$matrix.m14 = 0;
+    matrix.$matrix.m21 = 0;
+    matrix.$matrix.m22 = 2 / (top - bottom);
+    matrix.$matrix.m23 = 0;
+    matrix.$matrix.m24 = 0;
+    matrix.$matrix.m31 = 0;
+    matrix.$matrix.m32 = 0;
+    matrix.$matrix.m33 = -2 / (far - near);
+    matrix.$matrix.m34 = 0;
+    matrix.$matrix.m41 = tx;
+    matrix.$matrix.m42 = ty;
+    matrix.$matrix.m43 = tz;
+    matrix.$matrix.m44 = 1;
+
+    this.multiply(matrix);
+}
+
+J3DIMatrix4.prototype.frustum = function(left, right, bottom, top, near, far)
+{
+    var matrix = new J3DIMatrix4();
+    var A = (right + left) / (right - left);
+    var B = (top + bottom) / (top - bottom);
+    var C = -(far + near) / (far - near);
+    var D = -(2 * far * near) / (far - near);
+
+    matrix.$matrix.m11 = (2 * near) / (right - left);
+    matrix.$matrix.m12 = 0;
+    matrix.$matrix.m13 = 0;
+    matrix.$matrix.m14 = 0;
+
+    matrix.$matrix.m21 = 0;
+    matrix.$matrix.m22 = 2 * near / (top - bottom);
+    matrix.$matrix.m23 = 0;
+    matrix.$matrix.m24 = 0;
+
+    matrix.$matrix.m31 = A;
+    matrix.$matrix.m32 = B;
+    matrix.$matrix.m33 = C;
+    matrix.$matrix.m34 = -1;
+
+    matrix.$matrix.m41 = 0;
+    matrix.$matrix.m42 = 0;
+    matrix.$matrix.m43 = D;
+    matrix.$matrix.m44 = 0;
+
+    this.multiply(matrix);
+}
+
+J3DIMatrix4.prototype.perspective = function(fovy, aspect, zNear, zFar)
+{
+    var top = Math.tan(fovy * Math.PI / 360) * zNear;
+    var bottom = -top;
+    var left = aspect * bottom;
+    var right = aspect * top;
+    this.frustum(left, right, bottom, top, zNear, zFar);
+}
+
+J3DIMatrix4.prototype.lookat = function(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz)
+{
+    if (typeof eyez == 'object' && "length" in eyez) {
+        var t = eyez;
+        upx = t[0];
+        upy = t[1];
+        upz = t[2];
+
+        t = eyey;
+        centerx = t[0];
+        centery = t[1];
+        centerz = t[2];
+
+        t = eyex;
+        eyex = t[0];
+        eyey = t[1];
+        eyez = t[2];
+    }
+
+    var matrix = new J3DIMatrix4();
+
+    // Make rotation matrix
+
+    // Z vector
+    var zx = eyex - centerx;
+    var zy = eyey - centery;
+    var zz = eyez - centerz;
+    var mag = Math.sqrt(zx * zx + zy * zy + zz * zz);
+    if (mag) {
+        zx /= mag;
+        zy /= mag;
+        zz /= mag;
+    }
+
+    // Y vector
+    var yx = upx;
+    var yy = upy;
+    var yz = upz;
+
+    // X vector = Y cross Z
+    xx =  yy * zz - yz * zy;
+    xy = -yx * zz + yz * zx;
+    xz =  yx * zy - yy * zx;
+
+    // Recompute Y = Z cross X
+    yx = zy * xz - zz * xy;
+    yy = -zx * xz + zz * xx;
+    yx = zx * xy - zy * xx;
+
+    // cross product gives area of parallelogram, which is < 1.0 for
+    // non-perpendicular unit-length vectors; so normalize x, y here
+
+    mag = Math.sqrt(xx * xx + xy * xy + xz * xz);
+    if (mag) {
+        xx /= mag;
+        xy /= mag;
+        xz /= mag;
+    }
+
+    mag = Math.sqrt(yx * yx + yy * yy + yz * yz);
+    if (mag) {
+        yx /= mag;
+        yy /= mag;
+        yz /= mag;
+    }
+
+    matrix.$matrix.m11 = xx;
+    matrix.$matrix.m12 = xy;
+    matrix.$matrix.m13 = xz;
+    matrix.$matrix.m14 = 0;
+
+    matrix.$matrix.m21 = yx;
+    matrix.$matrix.m22 = yy;
+    matrix.$matrix.m23 = yz;
+    matrix.$matrix.m24 = 0;
+
+    matrix.$matrix.m31 = zx;
+    matrix.$matrix.m32 = zy;
+    matrix.$matrix.m33 = zz;
+    matrix.$matrix.m34 = 0;
+
+    matrix.$matrix.m41 = 0;
+    matrix.$matrix.m42 = 0;
+    matrix.$matrix.m43 = 0;
+    matrix.$matrix.m44 = 1;
+    matrix.translate(-eyex, -eyey, -eyez);
+
+    this.multiply(matrix);
+}
+
+// Returns true on success, false otherwise. All params are Array objects
+J3DIMatrix4.prototype.decompose = function(_translate, _rotate, _scale, _skew, _perspective)
+{
+    // Normalize the matrix.
+    if (this.$matrix.m44 == 0)
+        return false;
+
+    // Gather the params
+    var translate, rotate, scale, skew, perspective;
+
+    var translate = (_translate == undefined || !("length" in _translate)) ? new J3DIVector3 : _translate;
+    var rotate = (_rotate == undefined || !("length" in _rotate)) ? new J3DIVector3 : _rotate;
+    var scale = (_scale == undefined || !("length" in _scale)) ? new J3DIVector3 : _scale;
+    var skew = (_skew == undefined || !("length" in _skew)) ? new J3DIVector3 : _skew;
+    var perspective = (_perspective == undefined || !("length" in _perspective)) ? new Array(4) : _perspective;
+
+    var matrix = new J3DIMatrix4(this);
+
+    matrix.divide(matrix.$matrix.m44);
+
+    // perspectiveMatrix is used to solve for perspective, but it also provides
+    // an easy way to test for singularity of the upper 3x3 component.
+    var perspectiveMatrix = new J3DIMatrix4(matrix);
+
+    perspectiveMatrix.$matrix.m14 = 0;
+    perspectiveMatrix.$matrix.m24 = 0;
+    perspectiveMatrix.$matrix.m34 = 0;
+    perspectiveMatrix.$matrix.m44 = 1;
+
+    if (perspectiveMatrix._determinant4x4() == 0)
+        return false;
+
+    // First, isolate perspective.
+    if (matrix.$matrix.m14 != 0 || matrix.$matrix.m24 != 0 || matrix.$matrix.m34 != 0) {
+        // rightHandSide is the right hand side of the equation.
+        var rightHandSide = [ matrix.$matrix.m14, matrix.$matrix.m24, matrix.$matrix.m34, matrix.$matrix.m44 ];
+
+        // Solve the equation by inverting perspectiveMatrix and multiplying
+        // rightHandSide by the inverse.
+        var inversePerspectiveMatrix = new J3DIMatrix4(perspectiveMatrix);
+        inversePerspectiveMatrix.invert();
+        var transposedInversePerspectiveMatrix = new J3DIMatrix4(inversePerspectiveMatrix);
+        transposedInversePerspectiveMatrix.transpose();
+        transposedInversePerspectiveMatrix.multVecMatrix(perspective, rightHandSide);
+
+        // Clear the perspective partition
+        matrix.$matrix.m14 = matrix.$matrix.m24 = matrix.$matrix.m34 = 0
+        matrix.$matrix.m44 = 1;
+    }
+    else {
+        // No perspective.
+        perspective[0] = perspective[1] = perspective[2] = 0;
+        perspective[3] = 1;
+    }
+
+    // Next take care of translation
+    translate[0] = matrix.$matrix.m41
+    matrix.$matrix.m41 = 0
+    translate[1] = matrix.$matrix.m42
+    matrix.$matrix.m42 = 0
+    translate[2] = matrix.$matrix.m43
+    matrix.$matrix.m43 = 0
+
+    // Now get scale and shear. 'row' is a 3 element array of 3 component vectors
+    var row0 = new J3DIVector3(matrix.$matrix.m11, matrix.$matrix.m12, matrix.$matrix.m13);
+    var row1 = new J3DIVector3(matrix.$matrix.m21, matrix.$matrix.m22, matrix.$matrix.m23);
+    var row2 = new J3DIVector3(matrix.$matrix.m31, matrix.$matrix.m32, matrix.$matrix.m33);
+
+    // Compute X scale factor and normalize first row.
+    scale[0] = row0.vectorLength();
+    row0.divide(scale[0]);
+
+    // Compute XY shear factor and make 2nd row orthogonal to 1st.
+    skew[0] = row0.dot(row1);
+    row1.combine(row0, 1.0, -skew[0]);
+
+    // Now, compute Y scale and normalize 2nd row.
+    scale[1] = row1.vectorLength();
+    row1.divide(scale[1]);
+    skew[0] /= scale[1];
+
+    // Compute XZ and YZ shears, orthogonalize 3rd row
+    skew[1] = row1.dot(row2);
+    row2.combine(row0, 1.0, -skew[1]);
+    skew[2] = row1.dot(row2);
+    row2.combine(row1, 1.0, -skew[2]);
+
+    // Next, get Z scale and normalize 3rd row.
+    scale[2] = row2.vectorLength();
+    row2.divide(scale[2]);
+    skew[1] /= scale[2];
+    skew[2] /= scale[2];
+
+    // At this point, the matrix (in rows) is orthonormal.
+    // Check for a coordinate system flip.  If the determinant
+    // is -1, then negate the matrix and the scaling factors.
+    var pdum3 = new J3DIVector3(row1);
+    pdum3.cross(row2);
+    if (row0.dot(pdum3) < 0) {
+        for (i = 0; i < 3; i++) {
+            scale[i] *= -1;
+            row[0][i] *= -1;
+            row[1][i] *= -1;
+            row[2][i] *= -1;
+        }
+    }
+
+    // Now, get the rotations out
+    rotate[1] = Math.asin(-row0[2]);
+    if (Math.cos(rotate[1]) != 0) {
+        rotate[0] = Math.atan2(row1[2], row2[2]);
+        rotate[2] = Math.atan2(row0[1], row0[0]);
+    }
+    else {
+        rotate[0] = Math.atan2(-row2[0], row1[1]);
+        rotate[2] = 0;
+    }
+
+    // Convert rotations to degrees
+    var rad2deg = 180 / Math.PI;
+    rotate[0] *= rad2deg;
+    rotate[1] *= rad2deg;
+    rotate[2] *= rad2deg;
+
+    return true;
+}
+
+J3DIMatrix4.prototype._determinant2x2 = function(a, b, c, d)
+{
+    return a * d - b * c;
+}
+
+J3DIMatrix4.prototype._determinant3x3 = function(a1, a2, a3, b1, b2, b3, c1, c2, c3)
+{
+    return a1 * this._determinant2x2(b2, b3, c2, c3)
+         - b1 * this._determinant2x2(a2, a3, c2, c3)
+         + c1 * this._determinant2x2(a2, a3, b2, b3);
+}
+
+J3DIMatrix4.prototype._determinant4x4 = function()
+{
+    var a1 = this.$matrix.m11;
+    var b1 = this.$matrix.m12;
+    var c1 = this.$matrix.m13;
+    var d1 = this.$matrix.m14;
+
+    var a2 = this.$matrix.m21;
+    var b2 = this.$matrix.m22;
+    var c2 = this.$matrix.m23;
+    var d2 = this.$matrix.m24;
+
+    var a3 = this.$matrix.m31;
+    var b3 = this.$matrix.m32;
+    var c3 = this.$matrix.m33;
+    var d3 = this.$matrix.m34;
+
+    var a4 = this.$matrix.m41;
+    var b4 = this.$matrix.m42;
+    var c4 = this.$matrix.m43;
+    var d4 = this.$matrix.m44;
+
+    return a1 * this._determinant3x3(b2, b3, b4, c2, c3, c4, d2, d3, d4)
+         - b1 * this._determinant3x3(a2, a3, a4, c2, c3, c4, d2, d3, d4)
+         + c1 * this._determinant3x3(a2, a3, a4, b2, b3, b4, d2, d3, d4)
+         - d1 * this._determinant3x3(a2, a3, a4, b2, b3, b4, c2, c3, c4);
+}
+
+J3DIMatrix4.prototype._makeAdjoint = function()
+{
+    var a1 = this.$matrix.m11;
+    var b1 = this.$matrix.m12;
+    var c1 = this.$matrix.m13;
+    var d1 = this.$matrix.m14;
+
+    var a2 = this.$matrix.m21;
+    var b2 = this.$matrix.m22;
+    var c2 = this.$matrix.m23;
+    var d2 = this.$matrix.m24;
+
+    var a3 = this.$matrix.m31;
+    var b3 = this.$matrix.m32;
+    var c3 = this.$matrix.m33;
+    var d3 = this.$matrix.m34;
+
+    var a4 = this.$matrix.m41;
+    var b4 = this.$matrix.m42;
+    var c4 = this.$matrix.m43;
+    var d4 = this.$matrix.m44;
+
+    // Row column labeling reversed since we transpose rows & columns
+    this.$matrix.m11  =   this._determinant3x3(b2, b3, b4, c2, c3, c4, d2, d3, d4);
+    this.$matrix.m21  = - this._determinant3x3(a2, a3, a4, c2, c3, c4, d2, d3, d4);
+    this.$matrix.m31  =   this._determinant3x3(a2, a3, a4, b2, b3, b4, d2, d3, d4);
+    this.$matrix.m41  = - this._determinant3x3(a2, a3, a4, b2, b3, b4, c2, c3, c4);
+
+    this.$matrix.m12  = - this._determinant3x3(b1, b3, b4, c1, c3, c4, d1, d3, d4);
+    this.$matrix.m22  =   this._determinant3x3(a1, a3, a4, c1, c3, c4, d1, d3, d4);
+    this.$matrix.m32  = - this._determinant3x3(a1, a3, a4, b1, b3, b4, d1, d3, d4);
+    this.$matrix.m42  =   this._determinant3x3(a1, a3, a4, b1, b3, b4, c1, c3, c4);
+
+    this.$matrix.m13  =   this._determinant3x3(b1, b2, b4, c1, c2, c4, d1, d2, d4);
+    this.$matrix.m23  = - this._determinant3x3(a1, a2, a4, c1, c2, c4, d1, d2, d4);
+    this.$matrix.m33  =   this._determinant3x3(a1, a2, a4, b1, b2, b4, d1, d2, d4);
+    this.$matrix.m43  = - this._determinant3x3(a1, a2, a4, b1, b2, b4, c1, c2, c4);
+
+    this.$matrix.m14  = - this._determinant3x3(b1, b2, b3, c1, c2, c3, d1, d2, d3);
+    this.$matrix.m24  =   this._determinant3x3(a1, a2, a3, c1, c2, c3, d1, d2, d3);
+    this.$matrix.m34  = - this._determinant3x3(a1, a2, a3, b1, b2, b3, d1, d2, d3);
+    this.$matrix.m44  =   this._determinant3x3(a1, a2, a3, b1, b2, b3, c1, c2, c3);
+}
+
+//
+// J3DIVector3
+//
+J3DIVector3 = function(x,y,z)
+{
+    this.load(x,y,z);
+}
+
+J3DIVector3.prototype.load = function(x,y,z)
+{
+    if (typeof x == 'object' && "length" in x) {
+        this[0] = x[0];
+        this[1] = x[1];
+        this[2] = x[2];
+    }
+    else if (typeof x == 'number') {
+        this[0] = x;
+        this[1] = y;
+        this[2] = z;
+    }
+    else {
+        this[0] = 0;
+        this[1] = 0;
+        this[2] = 0;
+    }
+}
+
+J3DIVector3.prototype.getAsArray = function()
+{
+    return [ this[0], this[1], this[2] ];
+}
+
+J3DIVector3.prototype.getAsFloat32Array = function()
+{
+    return new Float32Array(this.getAsArray());
+}
+
+J3DIVector3.prototype.vectorLength = function()
+{
+    return Math.sqrt(this[0] * this[0] + this[1] * this[1] + this[2] * this[2]);
+}
+
+J3DIVector3.prototype.divide = function(divisor)
+{
+    this[0] /= divisor; this[1] /= divisor; this[2] /= divisor;
+}
+
+J3DIVector3.prototype.cross = function(v)
+{
+    this[0] =  this[1] * v[2] - this[2] * v[1];
+    this[1] = -this[0] * v[2] + this[2] * v[0];
+    this[2] =  this[0] * v[1] - this[1] * v[0];
+}
+
+J3DIVector3.prototype.dot = function(v)
+{
+    return this[0] * v[0] + this[1] * v[1] + this[2] * v[2];
+}
+
+J3DIVector3.prototype.combine = function(v, ascl, bscl)
+{
+    this[0] = (ascl * this[0]) + (bscl * v[0]);
+    this[1] = (ascl * this[1]) + (bscl * v[1]);
+    this[2] = (ascl * this[2]) + (bscl * v[2]);
+}
+
+J3DIVector3.prototype.multVecMatrix = function(matrix)
+{
+    var x = this[0];
+    var y = this[1];
+    var z = this[2];
+
+    this[0] = matrix.$matrix.m41 + x * matrix.$matrix.m11 + y * matrix.$matrix.m21 + z * matrix.$matrix.m31;
+    this[1] = matrix.$matrix.m42 + x * matrix.$matrix.m12 + y * matrix.$matrix.m22 + z * matrix.$matrix.m32;
+    this[2] = matrix.$matrix.m43 + x * matrix.$matrix.m13 + y * matrix.$matrix.m23 + z * matrix.$matrix.m33;
+    var w = matrix.$matrix.m44 + x * matrix.$matrix.m14 + y * matrix.$matrix.m24 + z * matrix.$matrix.m34;
+    if (w != 1 && w != 0) {
+        this[0] /= w;
+        this[1] /= w;
+        this[2] /= w;
+    }
+}
+
+J3DIVector3.prototype.toString = function()
+{
+    return "["+this[0]+","+this[1]+","+this[2]+"]";
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webGL/src/const.js	Wed Apr 25 23:45:59 2012 +0900
@@ -0,0 +1,3 @@
+const TITLE = 0;
+const MENU = 1;
+const MAIN = 2;
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webGL/src/f4xml.js	Wed Apr 25 23:45:59 2012 +0900
@@ -0,0 +1,170 @@
+function parseXml(gl){
+    imgs = [];
+    loadObjXml(gl,"./xml/title.xml");
+    loadObjXml(gl,"./xml/press.xml");
+    loadObjXml(gl,"./xml/mainmode.xml");
+    imgs.push(gl.obj["title"]);
+    imgs.push(gl.obj["press"]);
+    imgs.push(gl.obj["mainmode"]);
+}
+
+function loadObjXml(gl,url)
+{
+    if(gl.obj == undefined) gl.obj = new Object();
+    var xmlChara = new Object();
+    xmlChara = parsePanel(url);
+    for (var name in xmlChara)
+    {
+        gl.obj[name] = makeXmlObj(gl, xmlChara[name]);
+        gl.obj[name].texture = loadImageTexture(gl, xmlChara[name].image);
+    }
+}
+
+
+function PutSpriteF(ctx,x,y,scale,glObj){
+    ctx.enableVertexAttribArray(0);
+    ctx.enableVertexAttribArray(1);
+    ctx.enableVertexAttribArray(2);
+
+    ctx.bindBuffer(ctx.ARRAY_BUFFER, glObj.vertexObject);
+    ctx.vertexAttribPointer(2, 3, ctx.FLOAT, false, 0, 0);
+    ctx.bindBuffer(ctx.ARRAY_BUFFER, glObj.normalObject);
+    ctx.vertexAttribPointer(0, 3, ctx.FLOAT, false, 0, 0);
+    
+    ctx.bindBuffer(ctx.ARRAY_BUFFER, glObj.texCoordObject);
+    ctx.vertexAttribPointer(1, 2, ctx.FLOAT, false, 0, 0);
+
+    ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, glObj.indexObject);
+
+
+    // generate the model-view matrix
+    var mvMatrix = new J3DIMatrix4();
+    mvMatrix.scale(scale, scale, scale);
+    mvMatrix.translate( x, y, 10);
+    
+    // construct the normal matrix from the model-view matrix
+    var normalMatrix = new J3DIMatrix4(mvMatrix);
+    normalMatrix.invert();
+    normalMatrix.transpose();
+    normalMatrix.setUniform(ctx, ctx.getUniformLocation(ctx.program, "u_normalMatrix"), false);
+    
+    // construct the model-view * projection matrix
+    var mvpMatrix = new J3DIMatrix4(ctx.perspectiveMatrix);
+    mvpMatrix.multiply(mvMatrix);
+    mvpMatrix.setUniform(ctx, ctx.getUniformLocation(ctx.program, "u_modelViewProjMatrix"), false);
+
+    
+    ctx.bindTexture(ctx.TEXTURE_2D, glObj.texture);
+    ctx.drawElements(ctx.TRIANGLES, glObj.numIndices, ctx.UNSIGNED_SHORT, 0);
+
+
+}
+
+function parsePanel( url ) {
+    var http = new JKL.ParseXML( url );
+    var data = http.parse()["OBJECT-3D"];
+    var xmlObj = new Object();
+
+    if (data["surface"][0]) {
+	for (var i in data["surface"]) {
+	    var obj = xmlObj[data["surface"][i]["name"]] = new Object();
+	    obj.vertex = splitVector(data["surface"][i]["coordinate"]);
+	    obj.normal = splitVector(data["surface"][i]["normal"]);
+	    obj.texCoords = splitVector(data["surface"][i]["texture"]);
+	    obj.model = splitVector(data["surface"][i]["model"]);
+	    var xmlObjImage = data["surface"][i]["image"];
+	    obj.image = 'data:image/png;base64,'+xmlObjImage["#text"];
+	}
+    } else {
+	var obj = xmlObj[data["surface"]["name"]] = new Object();
+	obj.vertex =  splitVector(data["surface"]["coordinate"]);
+	obj.normal =  splitVector(data["surface"]["normal"]);
+	obj.texCoords = splitVector(data["surface"]["texture"]);
+	obj.model = splitVector(data["surface"]["model"]);
+	var xmlObjImage = data["surface"]["image"];
+	obj.image = 'data:image/png;base64,'+xmlObjImage["#text"];
+    }
+
+    return xmlObj;
+}
+
+function splitVector(str) {
+    //    return str.replace(/^\s+/g, "").replace(/\s+/g, " ").split(" ");
+    return str.replace(/^\s+/g, "").replace(/\s+/g, " ").replace(/\s$/g, "").split(" ");
+}
+
+function makeXmlObj(ctx, xmlObj)
+{
+
+    var model = new Object();
+    model.x = parseFloat(xmlObj.model[0]);
+    model.y = parseFloat(xmlObj.model[1]);
+    model.z = parseFloat(xmlObj.model[2]);
+  
+    var geometryData = [ ];
+    var normalData   = [ ];
+    var texCoordData = [ ];
+    var indexData    = [ ];
+    var index = 0;
+    var xmax = 0;
+    var xmin = 0;
+    var ymax = 0;
+    var ymin = 0;    
+   
+    
+    for(var i=0; xmlObj.vertex[i]; i+=3){
+	geometryData.push(parseFloat(xmlObj.vertex[i]) - model.x);
+	geometryData.push(parseFloat(xmlObj.vertex[i+1]) - model.y);
+	geometryData.push(parseFloat(xmlObj.vertex[i+2]) - model.z);
+	if ( (i % 3) == 0) {
+	    indexData.push(index);
+	    index++;
+	}
+	//オブジェクトの最大・最小のx,y座標を求める
+	if ( i == 0) {
+	    xmax = geometryData[0];
+	    xmin = geometryData[0];
+	    ymax = geometryData[1];
+	    ymin = geometryData[1];
+	}
+	if ( i > 0 ){
+	    xmax = Math.max( xmax, geometryData[i]);
+	    xmin = Math.min( xmin, geometryData[i]);
+	    ymax = Math.max( ymax, geometryData[i+1]);
+	    ymin = Math.min( ymin, geometryData[i+1]);
+	}
+    }
+    for(i=0; xmlObj.texCoords[i]; i++){
+	texCoordData.push(parseFloat(xmlObj.texCoords[i]));
+
+    }
+    for(i=0; xmlObj.normal[i]; i+=3){
+	normalData.push(parseFloat(xmlObj.normal[i]));
+	normalData.push(parseFloat(xmlObj.normal[i+1]));
+	normalData.push(parseFloat(xmlObj.normal[i+2]));
+    }
+
+    var retval = { };
+    //オブジェクトの横幅,縦幅を求める
+    retval.w = xmax - xmin;
+    retval.h = ymax - ymin;
+
+    retval.normalObject = ctx.createBuffer();
+    ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.normalObject);
+    ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(normalData), ctx.STATIC_DRAW);
+    
+    retval.texCoordObject = ctx.createBuffer();
+    ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.texCoordObject);
+    ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(texCoordData), ctx.STATIC_DRAW);
+    
+    retval.vertexObject = ctx.createBuffer();
+    ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.vertexObject);
+    ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(geometryData), ctx.STATIC_DRAW);
+    
+    retval.numIndices = indexData.length;
+    retval.indexObject = ctx.createBuffer();
+    ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, retval.indexObject);
+    ctx.bufferData(ctx.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexData), ctx.STREAM_DRAW);
+    
+    return retval;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webGL/src/jkl-parsexml.js	Wed Apr 25 23:45:59 2012 +0900
@@ -0,0 +1,676 @@
+// ================================================================
+//  jkl-parsexml.js ---- JavaScript Kantan Library for Parsing XML
+//  Copyright 2005-2007 Kawasaki Yusuke <u-suke@kawa.net>
+//  http://www.kawa.net/works/js/jkl/parsexml.html
+// ================================================================
+//  v0.01  2005/05/18  first release
+//  v0.02  2005/05/20  Opera 8.0beta may be abailable but somtimes crashed
+//  v0.03  2005/05/20  overrideMimeType( "text/xml" );
+//  v0.04  2005/05/21  class variables: REQUEST_TYPE, RESPONSE_TYPE
+//  v0.05  2005/05/22  use Msxml2.DOMDocument.5.0 for GET method on IE6
+//  v0.06  2005/05/22  CDATA_SECTION_NODE
+//  v0.07  2005/05/23  use Microsoft.XMLDOM for GET method on IE6
+//  v0.10  2005/10/11  new function: JKL.ParseXML.HTTP.responseText()
+//  v0.11  2005/10/13  new sub class: JKL.ParseXML.Text, JSON and DOM.
+//  v0.12  2005/10/14  new sub class: JKL.ParseXML.CSV and CSVmap.
+//  v0.13  2005/10/28  bug fixed: TEXT_NODE regexp for white spaces
+//  v0.14  2005/11/06  bug fixed: TEXT_NODE regexp at Safari
+//  v0.15  2005/11/08  bug fixed: JKL.ParseXML.CSV.async() method
+//  v0.16  2005/11/15  new sub class: LoadVars, and UTF-8 text on Safari
+//  v0.18  2005/11/16  improve: UTF-8 text file on Safari
+//  v0.19  2006/02/03  use XMLHTTPRequest instead of ActiveX on IE7,iCab
+//  v0.20  2006/03/22  (skipped)
+//  v0.21  2006/11/30  use ActiveX again on IE7
+//  v0.22  2007/01/04  JKL.ParseXML.JSON.parseResponse() updated
+// ================================================================
+
+if ( typeof(JKL) == 'undefined' ) JKL = function() {};
+
+// ================================================================
+//  class: JKL.ParseXML 
+
+JKL.ParseXML = function ( url, query, method ) {
+    // debug.print( "new JKL.ParseXML( '"+url+"', '"+query+"', '"+method+"' );" );
+    this.http = new JKL.ParseXML.HTTP( url, query, method, false );
+    return this;
+};
+
+// ================================================================
+//  class variables
+
+JKL.ParseXML.VERSION = "0.22";
+JKL.ParseXML.MIME_TYPE_XML  = "text/xml";
+JKL.ParseXML.MAP_NODETYPE = [
+    "",
+    "ELEMENT_NODE",                 // 1
+    "ATTRIBUTE_NODE",               // 2
+    "TEXT_NODE",                    // 3
+    "CDATA_SECTION_NODE",           // 4
+    "ENTITY_REFERENCE_NODE",        // 5
+    "ENTITY_NODE",                  // 6
+    "PROCESSING_INSTRUCTION_NODE",  // 7
+    "COMMENT_NODE",                 // 8
+    "DOCUMENT_NODE",                // 9
+    "DOCUMENT_TYPE_NODE",           // 10
+    "DOCUMENT_FRAGMENT_NODE",       // 11
+    "NOTATION_NODE"                 // 12
+];
+
+// ================================================================
+//  define callback function (ajax)
+
+JKL.ParseXML.prototype.async = function ( func, args ) {
+    this.callback_func = func;      // callback function
+    this.callback_arg  = args;      // first argument
+};
+
+JKL.ParseXML.prototype.onerror = function ( func, args ) {
+    this.onerror_func = func;       // callback function
+};
+
+// ================================================================
+//  method: parse()
+//  return: parsed object
+//  Download a file from remote server and parse it.
+
+JKL.ParseXML.prototype.parse = function () {
+    if ( ! this.http ) return;
+
+    // set onerror call back 
+    if ( this.onerror_func ) {
+        this.http.onerror( this.onerror_func );
+    }
+
+    if ( this.callback_func ) {                             // async mode
+        var copy = this;
+        var proc = function() {
+            if ( ! copy.http ) return;
+            var data = copy.parseResponse();
+            copy.callback_func( data, copy.callback_arg );  // call back
+        };
+        this.http.async( proc );
+    }
+
+    this.http.load();
+
+    if ( ! this.callback_func ) {                           // sync mode
+        var data = this.parseResponse();
+        return data;
+    }
+};
+
+// ================================================================
+//  every child/children into array
+JKL.ParseXML.prototype.setOutputArrayAll = function () {
+    this.setOutputArray( true );
+}
+//  a child into scalar, children into array
+JKL.ParseXML.prototype.setOutputArrayAuto = function () {
+    this.setOutputArray( null );
+}
+//  every child/children into scalar (first sibiling only)
+JKL.ParseXML.prototype.setOutputArrayNever = function () {
+    this.setOutputArray( false );
+}
+//  specified child/children into array, other child/children into scalar
+JKL.ParseXML.prototype.setOutputArrayElements = function ( list ) {
+    this.setOutputArray( list );
+}
+//  specify how to treate child/children into scalar/array
+JKL.ParseXML.prototype.setOutputArray = function ( mode ) {
+    if ( typeof(mode) == "string" ) {
+        mode = [ mode ];                // string into array
+    }
+    if ( mode && typeof(mode) == "object" ) {
+        if ( mode.length < 0 ) {
+            mode = false;               // false when array == [] 
+        } else {
+            var hash = {};
+            for( var i=0; i<mode.length; i++ ) {
+                hash[mode[i]] = true;
+            }
+            mode = hash;                // array into hashed array
+            if ( mode["*"] ) {
+                mode = true;            // true when includes "*"
+            }
+        } 
+    } 
+    this.usearray = mode;
+}
+
+// ================================================================
+//  method: parseResponse()
+
+JKL.ParseXML.prototype.parseResponse = function () {
+    var root = this.http.documentElement();
+    var data = this.parseDocument( root );
+    return data;
+}
+
+// ================================================================
+//  convert from DOM root node to JavaScript Object 
+//  method: parseElement( rootElement )
+
+JKL.ParseXML.prototype.parseDocument = function ( root ) {
+    // debug.print( "parseDocument: "+root );
+    if ( ! root ) return;
+
+    var ret = this.parseElement( root );            // parse root node
+    // debug.print( "parsed: "+ret );
+
+    if ( this.usearray == true ) {                  // always into array
+        ret = [ ret ];
+    } else if ( this.usearray == false ) {          // always into scalar
+        //
+    } else if ( this.usearray == null ) {           // automatic
+        //
+    } else if ( this.usearray[root.nodeName] ) {    // specified tag
+        ret = [ ret ];
+    }
+
+    var json = {};
+    json[root.nodeName] = ret;                      // root nodeName
+    return json;
+};
+
+// ================================================================
+//  convert from DOM Element to JavaScript Object 
+//  method: parseElement( element )
+
+JKL.ParseXML.prototype.parseElement = function ( elem ) {
+    // debug.print( "nodeType: "+JKL.ParseXML.MAP_NODETYPE[elem.nodeType]+" <"+elem.nodeName+">" );
+
+    //  COMMENT_NODE
+
+    if ( elem.nodeType == 7 ) {
+        return;
+    }
+
+    //  TEXT_NODE CDATA_SECTION_NODE
+
+    if ( elem.nodeType == 3 || elem.nodeType == 4 ) {
+        // var bool = elem.nodeValue.match( /[^\u0000-\u0020]/ );
+        var bool = elem.nodeValue.match( /[^\x00-\x20]/ ); // for Safari
+        if ( bool == null ) return;     // ignore white spaces
+        // debug.print( "TEXT_NODE: "+elem.nodeValue.length+ " "+bool );
+        return elem.nodeValue;
+    }
+
+    var retval;
+    var cnt = {};
+
+    //  parse attributes
+
+    if ( elem.attributes && elem.attributes.length ) {
+        retval = {};
+        for ( var i=0; i<elem.attributes.length; i++ ) {
+            var key = elem.attributes[i].nodeName;
+            if ( typeof(key) != "string" ) continue;
+            var val = elem.attributes[i].nodeValue;
+            if ( ! val ) continue;
+            if ( typeof(cnt[key]) == "undefined" ) cnt[key] = 0;
+            cnt[key] ++;
+            this.addNode( retval, key, cnt[key], val );
+        }
+    }
+
+    //  parse child nodes (recursive)
+
+    if ( elem.childNodes && elem.childNodes.length ) {
+        var textonly = true;
+        if ( retval ) textonly = false;        // some attributes exists
+        for ( var i=0; i<elem.childNodes.length && textonly; i++ ) {
+            var ntype = elem.childNodes[i].nodeType;
+            if ( ntype == 3 || ntype == 4 ) continue;
+            textonly = false;
+        }
+        if ( textonly ) {
+            if ( ! retval ) retval = "";
+            for ( var i=0; i<elem.childNodes.length; i++ ) {
+                retval += elem.childNodes[i].nodeValue;
+            }
+        } else {
+            if ( ! retval ) retval = {};
+            for ( var i=0; i<elem.childNodes.length; i++ ) {
+                var key = elem.childNodes[i].nodeName;
+                if ( typeof(key) != "string" ) continue;
+                var val = this.parseElement( elem.childNodes[i] );
+                if ( ! val ) continue;
+                if ( typeof(cnt[key]) == "undefined" ) cnt[key] = 0;
+                cnt[key] ++;
+                this.addNode( retval, key, cnt[key], val );
+            }
+        }
+    }
+    return retval;
+};
+
+// ================================================================
+//  method: addNode( hash, key, count, value )
+
+JKL.ParseXML.prototype.addNode = function ( hash, key, cnts, val ) {
+    if ( this.usearray == true ) {              // into array
+        if ( cnts == 1 ) hash[key] = [];
+        hash[key][hash[key].length] = val;      // push
+    } else if ( this.usearray == false ) {      // into scalar
+        if ( cnts == 1 ) hash[key] = val;       // only 1st sibling
+    } else if ( this.usearray == null ) {
+        if ( cnts == 1 ) {                      // 1st sibling
+            hash[key] = val;
+        } else if ( cnts == 2 ) {               // 2nd sibling
+            hash[key] = [ hash[key], val ];
+        } else {                                // 3rd sibling and more
+            hash[key][hash[key].length] = val;
+        }
+    } else if ( this.usearray[key] ) {
+        if ( cnts == 1 ) hash[key] = [];
+        hash[key][hash[key].length] = val;      // push
+    } else {
+        if ( cnts == 1 ) hash[key] = val;       // only 1st sibling
+    }
+};
+
+// ================================================================
+//  class: JKL.ParseXML.Text 
+
+JKL.ParseXML.Text = function ( url, query, method ) {
+    // debug.print( "new JKL.ParseXML.Text( '"+url+"', '"+query+"', '"+method+"' );" );
+    this.http = new JKL.ParseXML.HTTP( url, query, method, true );
+    return this;
+};
+
+JKL.ParseXML.Text.prototype.parse = JKL.ParseXML.prototype.parse;
+JKL.ParseXML.Text.prototype.async = JKL.ParseXML.prototype.async;
+JKL.ParseXML.Text.prototype.onerror = JKL.ParseXML.prototype.onerror;
+
+JKL.ParseXML.Text.prototype.parseResponse = function () {
+    var data = this.http.responseText();
+    return data;
+}
+
+// ================================================================
+//  class: JKL.ParseXML.JSON
+
+JKL.ParseXML.JSON = function ( url, query, method ) {
+    // debug.print( "new JKL.ParseXML.JSON( '"+url+"', '"+query+"', '"+method+"' );" );
+    this.http = new JKL.ParseXML.HTTP( url, query, method, true );
+    return this;
+};
+
+JKL.ParseXML.JSON.prototype.parse = JKL.ParseXML.prototype.parse;
+JKL.ParseXML.JSON.prototype.async = JKL.ParseXML.prototype.async;
+JKL.ParseXML.JSON.prototype.onerror = JKL.ParseXML.prototype.onerror;
+
+JKL.ParseXML.JSON.prototype.parseResponse = function () {
+    var text = this.http.responseText();
+    // http://www.antimon2.atnifty.com/2007/01/jklparsexmljson.html
+    if ( typeof(text) == 'undefined' ) return;
+    if ( ! text.length ) return;
+    var data = eval( "("+text+")" );
+    return data;
+}
+
+// ================================================================
+//  class: JKL.ParseXML.DOM
+
+JKL.ParseXML.DOM = function ( url, query, method ) {
+    // debug.print( "new JKL.ParseXML.DOM( '"+url+"', '"+query+"', '"+method+"' );" );
+    this.http = new JKL.ParseXML.HTTP( url, query, method, false );
+    return this;
+};
+
+JKL.ParseXML.DOM.prototype.parse = JKL.ParseXML.prototype.parse;
+JKL.ParseXML.DOM.prototype.async = JKL.ParseXML.prototype.async;
+JKL.ParseXML.DOM.prototype.onerror = JKL.ParseXML.prototype.onerror;
+
+JKL.ParseXML.DOM.prototype.parseResponse = function () {
+    var data = this.http.documentElement();
+    return data;
+}
+
+// ================================================================
+//  class: JKL.ParseXML.CSV
+
+JKL.ParseXML.CSV = function ( url, query, method ) {
+    // debug.print( "new JKL.ParseXML.CSV( '"+url+"', '"+query+"', '"+method+"' );" );
+    this.http = new JKL.ParseXML.HTTP( url, query, method, true );
+    return this;
+};
+
+JKL.ParseXML.CSV.prototype.parse = JKL.ParseXML.prototype.parse;
+JKL.ParseXML.CSV.prototype.async = JKL.ParseXML.prototype.async;
+JKL.ParseXML.CSV.prototype.onerror = JKL.ParseXML.prototype.onerror;
+
+JKL.ParseXML.CSV.prototype.parseResponse = function () {
+    var text = this.http.responseText();
+    var data = this.parseCSV( text );
+    return data;
+}
+
+JKL.ParseXML.CSV.prototype.parseCSV = function ( text ) {
+    text = text.replace( /\r\n?/g, "\n" );              // new line character
+    var pos = 0;
+    var len = text.length;
+    var table = [];
+    while( pos<len ) {
+        var line = [];
+        while( pos<len ) {
+            if ( text.charAt(pos) == '"' ) {            // "..." quoted column
+                var nextquote = text.indexOf( '"', pos+1 );
+                while ( nextquote<len && nextquote > -1 ) {
+                    if ( text.charAt(nextquote+1) != '"' ) {
+                        break;                          // end of column
+                    }
+                    nextquote = text.indexOf( '"', nextquote+2 );
+                }
+                if ( nextquote < 0 ) {
+                    // unclosed quote
+                } else if ( text.charAt(nextquote+1) == "," ) { // end of column
+                    var quoted = text.substr( pos+1, nextquote-pos-1 );
+                    quoted = quoted.replace(/""/g,'"');
+                    line[line.length] = quoted;
+                    pos = nextquote+2;
+                    continue;
+                } else if ( text.charAt(nextquote+1) == "\n" || // end of line
+                            len==nextquote+1 ) {                // end of file
+                    var quoted = text.substr( pos+1, nextquote-pos-1 );
+                    quoted = quoted.replace(/""/g,'"');
+                    line[line.length] = quoted;
+                    pos = nextquote+2;
+                    break;
+                } else {
+                    // invalid column
+                }
+            }
+            var nextcomma = text.indexOf( ",", pos );
+            var nextnline = text.indexOf( "\n", pos );
+            if ( nextnline < 0 ) nextnline = len;
+            if ( nextcomma > -1 && nextcomma < nextnline ) {
+                line[line.length] = text.substr( pos, nextcomma-pos );
+                pos = nextcomma+1;
+            } else {                                    // end of line
+                line[line.length] = text.substr( pos, nextnline-pos );
+                pos = nextnline+1;
+                break;
+            }
+        }
+        if ( line.length >= 0 ) {
+            table[table.length] = line;                 // push line
+        }
+    }
+    if ( table.length < 0 ) return;                     // null data
+    return table;
+};
+
+// ================================================================
+//  class: JKL.ParseXML.CSVmap
+
+JKL.ParseXML.CSVmap = function ( url, query, method ) {
+    // debug.print( "new JKL.ParseXML.CSVmap( '"+url+"', '"+query+"', '"+method+"' );" );
+    this.http = new JKL.ParseXML.HTTP( url, query, method, true );
+    return this;
+};
+
+JKL.ParseXML.CSVmap.prototype.parse = JKL.ParseXML.prototype.parse;
+JKL.ParseXML.CSVmap.prototype.async = JKL.ParseXML.prototype.async;
+JKL.ParseXML.CSVmap.prototype.onerror = JKL.ParseXML.prototype.onerror;
+JKL.ParseXML.CSVmap.prototype.parseCSV = JKL.ParseXML.CSV.prototype.parseCSV;
+
+JKL.ParseXML.CSVmap.prototype.parseResponse = function () {
+    var text = this.http.responseText();
+    var source = this.parseCSV( text );
+    if ( ! source ) return;
+    if ( source.length < 0 ) return;
+
+    var title = source.shift();                 // first line as title
+    var data = [];
+    for( var i=0; i<source.length; i++ ) {
+        var hash = {};
+        for( var j=0; j<title.length && j<source[i].length; j++ ) {
+            hash[title[j]] = source[i][j];      // array to map
+        }
+        data[data.length] = hash;               // push line
+    }
+    return data;
+}
+
+// ================================================================
+//  class: JKL.ParseXML.LoadVars
+
+JKL.ParseXML.LoadVars = function ( url, query, method ) {
+    // debug.print( "new JKL.ParseXML.LoadVars( '"+url+"', '"+query+"', '"+method+"' );" );
+    this.http = new JKL.ParseXML.HTTP( url, query, method, true );
+    return this;
+};
+
+JKL.ParseXML.LoadVars.prototype.parse = JKL.ParseXML.prototype.parse;
+JKL.ParseXML.LoadVars.prototype.async = JKL.ParseXML.prototype.async;
+JKL.ParseXML.LoadVars.prototype.onerror = JKL.ParseXML.prototype.onerror;
+
+JKL.ParseXML.LoadVars.prototype.parseResponse = function () {
+    var text = this.http.responseText();
+    text = text.replace( /\r\n?/g, "\n" );              // new line character
+    var hash = {};
+    var list = text.split( "&" );
+    for( var i=0; i<list.length; i++ ) {
+        var eq = list[i].indexOf( "=" );
+        if ( eq > -1 ) {
+            var key = decodeURIComponent(list[i].substr(0,eq).replace("+","%20"));
+            var val = decodeURIComponent(list[i].substr(eq+1).replace("+","%20"));
+            hash[key] = val;
+        } else {
+            hash[list[i]] = "";
+        }
+    }
+    return hash;
+};
+
+// ================================================================
+//  class: JKL.ParseXML.HTTP
+//  constructer: new JKL.ParseXML.HTTP()
+
+JKL.ParseXML.HTTP = function( url, query, method, textmode ) {
+    // debug.print( "new JKL.ParseXML.HTTP( '"+url+"', '"+query+"', '"+method+"', '"+textmode+"' );" );
+    this.url = url;
+    if ( typeof(query) == "string" ) {
+        this.query = query;
+    } else {
+        this.query = "";
+    }
+    if ( method ) {
+        this.method = method;
+    } else if ( typeof(query) == "string" ) {
+        this.method = "POST";
+    } else {
+        this.method = "GET";
+    }
+    this.textmode = textmode ? true : false;
+    this.req = null;
+    this.xmldom_flag = false;
+    this.onerror_func  = null;
+    this.callback_func = null;
+    this.already_done = null;
+    return this;
+};
+
+// ================================================================
+//  class variables
+
+JKL.ParseXML.HTTP.REQUEST_TYPE  = "application/x-www-form-urlencoded";
+JKL.ParseXML.HTTP.ACTIVEX_XMLDOM  = "Microsoft.XMLDOM";  // Msxml2.DOMDocument.5.0
+JKL.ParseXML.HTTP.ACTIVEX_XMLHTTP = "Microsoft.XMLHTTP"; // Msxml2.XMLHTTP.3.0
+JKL.ParseXML.HTTP.EPOCH_TIMESTAMP = "Thu, 01 Jun 1970 00:00:00 GMT"
+
+// ================================================================
+
+JKL.ParseXML.HTTP.prototype.onerror = JKL.ParseXML.prototype.onerror;
+JKL.ParseXML.HTTP.prototype.async = function( func ) {
+    this.async_func = func;
+}
+
+// ================================================================
+//  [IE+IXMLDOMElement]
+//      XML     text/xml            OK
+//      XML     application/rdf+xml OK
+//      TEXT    text/plain          NG
+//      TEXT    others              NG
+//  [IE+IXMLHttpRequest]
+//      XML     text/xml            OK
+//      XML     application/rdf+xml NG
+//      TEXT    text/plain          OK
+//      TEXT    others              OK
+//  [Firefox+XMLHttpRequest]
+//      XML     text/xml            OK
+//      XML     application/rdf+xml OK (overrideMimeType)
+//      TEXT    text/plain          OK
+//      TEXT    others              OK (overrideMimeType)
+//  [Opera+XMLHttpRequest]
+//      XML     text/xml            OK
+//      XML     application/rdf+xml OK
+//      TEXT    text/plain          OK
+//      TEXT    others              OK
+// ================================================================
+
+JKL.ParseXML.HTTP.prototype.load = function() {
+    // create XMLHttpRequest object
+    if ( window.ActiveXObject ) {                           // IE5.5,6,7
+        var activex = JKL.ParseXML.HTTP.ACTIVEX_XMLHTTP;    // IXMLHttpRequest
+        if ( this.method == "GET" && ! this.textmode ) {
+            // use IXMLDOMElement to accept any mime types
+            // because overrideMimeType() is not available on IE6
+            activex = JKL.ParseXML.HTTP.ACTIVEX_XMLDOM;     // IXMLDOMElement
+        }
+        // debug.print( "new ActiveXObject( '"+activex+"' )" );
+        this.req = new ActiveXObject( activex );
+    } else if ( window.XMLHttpRequest ) {                   // Firefox, Opera, iCab
+        // debug.print( "new XMLHttpRequest()" );
+        this.req = new XMLHttpRequest();
+    }
+
+    // async mode when call back function is specified
+    var async_flag = this.async_func ? true : false;
+    // debug.print( "async: "+ async_flag );
+
+    // open for XMLHTTPRequest (not for IXMLDOMElement)
+    if ( typeof(this.req.send) != "undefined" ) {
+        // debug.print( "open( '"+this.method+"', '"+this.url+"', "+async_flag+" );" );
+        this.req.open( this.method, this.url, async_flag );
+    }
+
+//  // If-Modified-Since: Thu, 01 Jun 1970 00:00:00 GMT
+//  if ( typeof(this.req.setRequestHeader) != "undefined" ) {
+//      // debug.print( "If-Modified-Since"+JKL.ParseXML.HTTP.EPOCH_TIMESTAMP );
+//      this.req.setRequestHeader( "If-Modified-Since", JKL.ParseXML.HTTP.EPOCH_TIMESTAMP );
+//  }
+
+    // Content-Type: application/x-www-form-urlencoded (request header)
+    // Some server does not accept without request content-type.
+    if ( typeof(this.req.setRequestHeader) != "undefined" ) {
+        // debug.print( "Content-Type: "+JKL.ParseXML.HTTP.REQUEST_TYPE+" (request)" );
+        this.req.setRequestHeader( "Content-Type", JKL.ParseXML.HTTP.REQUEST_TYPE );
+    }
+
+    // Content-Type: text/xml (response header)
+    // FireFox does not accept other mime types like application/rdf+xml etc.
+    if ( typeof(this.req.overrideMimeType) != "undefined" && ! this.textmode ) {
+        // debug.print( "Content-Type: "+JKL.ParseXML.MIME_TYPE_XML+" (response)" );
+        this.req.overrideMimeType( JKL.ParseXML.MIME_TYPE_XML );
+    }
+
+    // set call back handler when async mode
+    if ( async_flag ) {
+        var copy = this;
+        copy.already_done = false;                  // not parsed yet
+        var check_func = function () {
+            if ( copy.req.readyState != 4 ) return;
+            // debug.print( "readyState(async): "+copy.req.readyState );
+            var succeed = copy.checkResponse();
+            // debug.print( "checkResponse(async): "+succeed );
+            if ( ! succeed ) return;                // failed
+            if ( copy.already_done ) return;        // parse only once
+            copy.already_done = true;               // already parsed
+            copy.async_func();                      // call back async
+        };
+        this.req.onreadystatechange = check_func;
+        // for document.implementation.createDocument
+        // this.req.onload = check_func;
+    }
+
+    // send the request and query string
+    if ( typeof(this.req.send) != "undefined" ) {
+        // debug.print( "XMLHTTPRequest: send( '"+this.query+"' );" );
+        this.req.send( this.query );                        // XMLHTTPRequest
+    } else if ( typeof(this.req.load) != "undefined" ) {
+        // debug.print( "IXMLDOMElement: load( '"+this.url+"' );" );
+        this.req.async = async_flag;
+        this.req.load( this.url );                          // IXMLDOMElement
+    }
+
+    // just return when async mode
+    if ( async_flag ) return;
+
+    var succeed = this.checkResponse();
+    // debug.print( "checkResponse(sync): "+succeed );
+}
+
+// ================================================================
+//  method: checkResponse()
+
+JKL.ParseXML.HTTP.prototype.checkResponse = function() {
+    // parseError on IXMLDOMElement
+    if ( this.req.parseError && this.req.parseError.errorCode != 0 ) {
+        // debug.print( "parseError: "+this.req.parseError.reason );
+        if ( this.onerror_func ) this.onerror_func( this.req.parseError.reason );
+        return false;                       // failed
+    }
+
+    // HTTP response code
+    if ( this.req.status-0 > 0 &&
+         this.req.status != 200 &&          // OK
+         this.req.status != 206 &&          // Partial Content
+         this.req.status != 304 ) {         // Not Modified
+        // debug.print( "status: "+this.req.status );
+        if ( this.onerror_func ) this.onerror_func( this.req.status );
+        return false;                       // failed
+    }
+
+    return true;                            // succeed
+}
+
+// ================================================================
+//  method: documentElement()
+//  return: XML DOM in response body
+
+JKL.ParseXML.HTTP.prototype.documentElement = function() {
+    // debug.print( "documentElement: "+this.req );
+    if ( ! this.req ) return;
+    if ( this.req.responseXML ) {
+        return this.req.responseXML.documentElement;    // XMLHTTPRequest
+    } else {
+        return this.req.documentElement;                // IXMLDOMDocument
+    }
+}
+
+// ================================================================
+//  method: responseText()
+//  return: text string in response body
+
+JKL.ParseXML.HTTP.prototype.responseText = function() {
+    // debug.print( "responseText: "+this.req );
+    if ( ! this.req ) return;
+
+    //  Safari and Konqueror cannot understand the encoding of text files.
+    if ( navigator.appVersion.match( "KHTML" ) ) {
+        var esc = escape( this.req.responseText );
+//        debug.print( "escape: "+esc );
+        if ( ! esc.match("%u") && esc.match("%") ) {
+            return decodeURIComponent(esc);
+        }
+    }
+
+    return this.req.responseText;
+}
+
+// ================================================================
+//  http://msdn.microsoft.com/library/en-us/xmlsdk/html/d051f7c5-e882-42e8-a5b6-d1ce67af275c.asp
+// ================================================================
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webGL/src/keybord.js	Wed Apr 25 23:45:59 2012 +0900
@@ -0,0 +1,127 @@
+SPressed = false;
+DPressed = false;
+FPressed = false;
+JPressed = false;
+KPressed = false;
+QPressed = false;
+APressed = false;
+SpacePressed = false;
+PlayingBGM = false;
+AUTO = false;
+
+function keybordDown()
+{
+
+	var keyChar = String.fromCharCode(event.keyCode);
+	if(keyChar == "S" && !SPressed && MODE==MAIN) {
+	SPressed = true;
+	if(HCloseCnt%2==0){
+		audioStop(audioHClose2);
+		audioHClose.play();
+	}
+	else{
+		audioStop(audioHClose);
+		audioHClose2.play();
+	}
+	HCloseCnt++;
+	}
+	if(keyChar == "D" && !DPressed && MODE==MAIN) {
+	DPressed = true;
+	if(SnareCnt%2==0){
+		audioStop(audioSnare2);
+		audioSnare.play();
+	}
+	else{
+		audioStop(audioSnare);
+		audioSnare2.play();
+	}
+	SnareCnt++;
+	}
+	if(keyChar == "F" && !FPressed && MODE==MAIN) {
+	FPressed = true;
+	if(KickCnt%2==0){
+		audioStop(audioKick2);
+		audioKick.play();
+	}
+	else{
+		audioStop(audioKick);
+		audioKick2.play();
+	}
+	KickCnt++;
+	}
+	if(keyChar == "J" && !JPressed && MODE==MAIN) {
+	JPressed = true;
+	if(FtomCnt%2==0){
+		audioStop(audioFtom2);
+		audioFtom.play();
+	}
+	else{
+		audioStop(audioFtom);
+		audioFtom2.play();
+	}
+	FtomCnt++;
+	}
+	if(keyChar == "K" && !KPressed && MODE==MAIN) {
+	KPressed = true;
+	if(CymbalCnt%2==0){
+		audioStop(audioCymbal2);
+		audioCymbal.play();
+	}
+	else{
+		audioStop(audioCymbal);
+		audioCymbal2.play();
+	}
+	CymbalCnt++;
+	}
+	
+	if(keyChar == " " && !SpacePressed){
+		SpacePressed = true;
+		if(MODE==TITLE){
+			MODE = MAIN;
+		}
+		else{
+			if(!PlayingBGM){
+				PlayingBGM = true;
+				console.log("play");
+				audioBGM.play();
+			}
+			else{
+				console.log("stop");
+				audioStop(audioBGM);
+				PlayingBGM = false;
+			}
+		}
+	}	
+	console.log("Key: Pushed '"+keyChar+"'");
+	
+}
+function keybordPress(){}
+
+function keybordUp()
+{
+	var keyChar = String.fromCharCode(event.keyCode);
+	if(keyChar == "S"){
+	SPressed = false;
+	}
+	if(keyChar == "D"){
+	DPressed = false;
+	}
+	if(keyChar == "F"){
+	FPressed = false;
+	}
+	if(keyChar == "J"){
+	JPressed = false;
+	}
+	if(keyChar == "K"){
+	KPressed = false;
+	}
+	if(keyChar == "Q"){
+	JPressed = false;
+	}
+	if(keyChar == "A"){
+	KPressed = false;
+	}
+	if(keyChar == " "){
+	SpacePressed = false;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webGL/src/mainfunc.js	Wed Apr 25 23:45:59 2012 +0900
@@ -0,0 +1,29 @@
+function gameRender(ctx,MODE){
+	switch(MODE){
+	case TITLE:
+		titleRender(ctx);
+		break;
+	case MAIN:
+		mainRender(ctx);
+		break;
+	}
+}
+
+function titleRender(ctx){
+	reshape(ctx);
+    ctx.clearColor(0,0,0,1);
+    ctx.clear(ctx.COLOR_BUFFER_BIT | ctx.DEPTH_BUFFER_BIT);
+    PutSpriteF(ctx,100,30,1,imgs[0]);
+    PutSpriteF(ctx,98,90,1,imgs[1]);
+    ctx.flush();
+}
+
+function mainRender(ctx){
+	reshape(ctx);
+    ctx.clearColor(0,0,0,1);
+    ctx.clear(ctx.COLOR_BUFFER_BIT | ctx.DEPTH_BUFFER_BIT);
+	if(!AUTO){
+		PutSpriteF(ctx,100,30,1,imgs[2]);
+	}
+    ctx.flush();
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webGL/src/sound.js	Wed Apr 25 23:45:59 2012 +0900
@@ -0,0 +1,32 @@
+var audioHClose = window.Audio && new Audio("sound/hclose.wav");
+var audioHClose2 = window.Audio && new Audio("sound/hclose.wav");
+var audioHOpen = window.Audio && new Audio("sound/hopen.wav");
+var audioHOpen2 = window.Audio && new Audio("sound/hopen.wav");
+var audioFtom = window.Audio && new Audio("sound/ftom.wav");
+var audioFtom2 = window.Audio && new Audio("sound/ftom.wav");
+var audioCymbal = window.Audio && new Audio("sound/cymbal.wav");
+var audioCymbal2 = window.Audio && new Audio("sound/cymbal.wav");
+var audioKick = window.Audio && new Audio("sound/kick.wav");
+var audioKick2 = window.Audio && new Audio("sound/kick.wav");
+var audioSnare = window.Audio && new Audio("sound/snare.wav");
+var audioSnare2 = window.Audio && new Audio("sound/snare.wav");
+var audioBGM = window.Audio && new Audio("sound/BGM.wav");
+
+var CymbalCnt = 0;
+var HCloseCnt = 0;
+var HOpenCnt = 0;
+var FtomCnt = 0;
+var KickCnt = 0;
+var SnareCnt = 0;
+
+function audioStop(audioFile){
+    if(!audioFile.ended){
+	audioFile.pause();
+	audioFile.load();
+    }
+}
+
+function audioStart(audioFile){
+    audioFile.load();
+    audioFile.play();
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webGL/test2.html	Wed Apr 25 23:45:59 2012 +0900
@@ -0,0 +1,125 @@
+<!DOCTYPE html> 
+
+<html> 
+  <head> 
+	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+	<title>WebGL test2</title> 
+	<script src="src/keybord.js"></script>
+	<script src="src/sound.js"></script>
+	<script src="src/J3DI.js"></script>
+	<script src="src/J3DIMath.js"></script>
+	<script src="src/f4xml.js"></script>
+	<script src="src/const.js"></script>
+	<script src="src/mainfunc.js"></script>
+	<script src="src/jkl-parsexml.js"></script>
+  </head> 
+  <script id="vshader" type="x-shader/x-vertex">
+	uniform mat4 u_modelViewProjMatrix;
+	uniform mat4 u_normalMatrix;
+	uniform vec3 lightDir;
+	
+	attribute vec3 vNormal;
+	attribute vec4 vTexCoord;
+	attribute vec4 vPosition;
+	
+	varying float v_Dot;
+	varying vec2 v_texCoord;
+	
+	void main()
+	{
+	gl_Position = u_modelViewProjMatrix * vPosition;
+	v_texCoord = vTexCoord.st;
+	vec4 transNormal = u_normalMatrix * vec4(vNormal,1);
+	v_Dot = max(dot(transNormal.xyz, lightDir), 0.0);
+	}
+  </script>
+  
+  <script id="fshader" type="x-shader/x-fragment">
+	#ifdef GL_ES
+	precision mediump float;
+	#endif
+	
+	uniform sampler2D sampler2d;
+	
+	varying float v_Dot;
+	varying vec2 v_texCoord;
+	
+	void main()
+	{
+	vec4 color = texture2D(sampler2d,v_texCoord);
+	color += vec4(0.1,0.1,0.1,1);
+	//    if(color.a == 1.0)color=vec4(1,0,0,1);
+	//    else color=vec4(0,1,1,1);
+	gl_FragColor = vec4(color.xyz * v_Dot, color.a);
+	//    gl_FragColor = vec4(color.xyz * v_Dot, 0.5);
+	}
+  </script> 
+  <script> 
+  
+	var WIDTH = 1024;
+	var HEIGHT = 640;
+	var MODE = TITLE;
+	function start(){
+	var c = document.getElementById("example");
+	c.width = WIDTH;
+	c.height = HEIGHT;
+	var ctx = init();
+	l = function(){loop(ctx)};
+	setInterval(l,10);
+	}
+	
+	function init(){
+	  var gl = initWebGL("example","vshader","fshader",["vNormal","vTexCoord","vPosition"],[0,0,0,1],10000);
+	  gl.uniform3f(gl.getUniformLocation(gl.program,"lightDir"),0,0,1);
+	  gl.uniform1i(gl.getUniformLocation(gl.program,"sampler2d"),0);
+	  gl.enable(gl.TEXTURE_2D);
+	  parseXml(gl);
+	  
+	  return gl;
+	}
+	
+	function loop(ctx){ //main loop
+		gameRender(ctx,MODE);
+	}
+	
+		width = -1;
+		height = -1;
+		
+			function reshape(ctx)
+			{
+				var canvas = document.getElementById('example');
+				if (canvas.width == width && canvas.width == height)
+				return;
+				
+				width = canvas.width;
+				height = canvas.height;
+				
+				ctx.viewport(0, 0, width, height);
+				
+				ctx.perspectiveMatrix = new J3DIMatrix4();
+				ctx.perspectiveMatrix.ortho(0, -200, 0, -140, 0, 10000);
+			}
+			
+			
+	
+	
+  </script> 
+  <style type="text/css"> 
+	canvas {
+	border: 2px solid black;
+	}
+  </style> 
+  <body onload="start()" onkeydown="keybordDown()" onkeypress="keybordPress()" onkeyup="keybordUp()" style='overflow:scroll'>
+	<font size="4">
+	TITLE) SPACE:Go to MAIN MODE<br>
+	MAIN MODE)S:High-hat &nbsp;&nbsp; D:Snare  &nbsp;&nbsp; F:Kick  &nbsp;&nbsp; J:Tom  &nbsp;&nbsp; K:Cymbal  &nbsp;&nbsp; SPACE:Play/Stop &nbsp;&nbsp; <!--A:AUTO PLAY<br>-->
+<!--  	AUTO PLAY)Q:Quit(Back to MAIN MODE)-->
+	</font>
+	<canvas id="example"> 
+	  There is supposed to be an example drawing here, but it's not important.
+	</canvas> 
+	<div id="framerate"></div> 
+	<div id="console"></div> 
+  </body> 
+</html> 
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webGL/xml/font_pushstart.xml	Wed Apr 25 23:45:59 2012 +0900
@@ -0,0 +1,154 @@
+<?xml version="1.0"?>
+<OBJECT-3D>
+	<surface name="font_pushstart" size="6" prim="Triangle" parent="NULL">
+		<coordinate>
+			-29.999996 -3.000000 0.000000
+			29.999994 -3.000000 0.000000
+			30.000006 3.000000 0.000000
+			30.000006 3.000000 0.000000
+			-30.000004 3.000000 0.000000
+			-29.999996 -3.000000 0.000000
+		</coordinate>
+		<normal>
+			0.000000 0.000000 1.000000
+			0.000000 0.000000 1.000000
+			0.000000 0.000000 1.000000
+			0.000000 0.000000 1.000000
+			0.000000 0.000000 1.000000
+			0.000000 0.000000 1.000000
+		</normal>
+		<model>
+			0.000000 0.000000 0.000000
+		</model>
+		<texture>
+			0.000000 0.000000
+			1.000000 0.000000
+			1.000000 1.000000
+			1.000000 1.000000
+			0.000000 1.000000
+			0.000000 0.000000
+		</texture>
+		<image name="font_pushstart.png">
+			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
+		</image>
+	</surface>
+</OBJECT-3D>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webGL/xml/mainmode.xml	Wed Apr 25 23:45:59 2012 +0900
@@ -0,0 +1,231 @@
+<?xml version="1.0"?>
+<OBJECT-3D>
+	<surface name="mainmode" size="6" prim="Triangle" parent="NULL">
+		<coordinate>
+			-44.999996 -10.000000 0.000000
+			44.999994 -10.000000 0.000000
+			45.000006 10.000000 0.000000
+			45.000006 10.000000 0.000000
+			-45.000004 10.000000 0.000000
+			-44.999996 -10.000000 0.000000
+		</coordinate>
+		<normal>
+			0.000000 0.000000 1.000000
+			0.000000 0.000000 1.000000
+			0.000000 0.000000 1.000000
+			0.000000 0.000000 1.000000
+			0.000000 0.000000 1.000000
+			0.000000 0.000000 1.000000
+		</normal>
+		<model>
+			0.000000 0.000000 0.000000
+		</model>
+		<texture>
+			0.000000 0.000000
+			1.000000 0.000000
+			1.000000 1.000000
+			1.000000 1.000000
+			0.000000 1.000000
+			0.000000 0.000000
+		</texture>
+		<image name="mainmode.png">
+				iVBORw0KGgoAAAANSUhEUgAAAQQAAAAxCAYAAAA8yNegAAAD8GlDQ1BJQ0MgUHJv
+				ZmlsZQAAKJGNVd1v21QUP4lvXKQWP6Cxjg4Vi69VU1u5GxqtxgZJk6XpQhq5zdgq
+				pMl1bhpT1za2021Vn/YCbwz4A4CyBx6QeEIaDMT2su0BtElTQRXVJKQ9dNpAaJP2
+				gqpwrq9Tu13GuJGvfznndz7v0TVAx1ea45hJGWDe8l01n5GPn5iWO1YhCc9BJ/RA
+				p6Z7TrpcLgIuxoVH1sNfIcHeNwfa6/9zdVappwMknkJsVz19HvFpgJSpO64PIN5G
+				+fAp30Hc8TziHS4miFhheJbjLMMzHB8POFPqKGKWi6TXtSriJcT9MzH5bAzzHIK1
+				I08t6hq6zHpRdu2aYdJYuk9Q/881bzZa8Xrx6fLmJo/iu4/VXnfH1BB/rmu5ScQv
+				I77m+BkmfxXxvcZcJY14L0DymZp7pML5yTcW61PvIN6JuGr4halQvmjNlCa4bXJ5
+				zj6qhpxrujeKPYMXEd+q00KR5yNAlWZzrF+Ie+uNsdC/MO4tTOZafhbroyXuR3Df
+				08bLiHsQf+ja6gTPWVimZl7l/oUrjl8OcxDWLbNU5D6JRL2gxkDu16fGuC054OMh
+				clsyXTOOFEL+kmMGs4i5kfNuQ62EnBuam8tzP+Q+tSqhz9SuqpZlvR1EfBiOJTSg
+				YMMM7jpYsAEyqJCHDL4dcFFTAwNMlFDUUpQYiadhDmXteeWAw3HEmA2s15k1RmnP
+				4RHuhBybdBOF7MfnICmSQ2SYjIBM3iRvkcMki9IRcnDTthyLz2Ld2fTzPjTQK+Md
+				g8y5nkZfFO+se9LQr3/09xZr+5GcaSufeAfAww60mAPx+q8u/bAr8rFCLrx7s+vq
+				Ekw8qb+p26n11Aruq6m1iJH6PbWGv1VIY25mkNE8PkaQhxfLIF7DZXx80HD/A3l2
+				jLclYs061xNpWCfoB6WHJTjbH0mV35Q/lRXlC+W8cndbl9t2SfhU+Fb4UfhO+F74
+				GWThknBZ+Em4InwjXIyd1ePnY/Psg3pb1TJNu15TMKWMtFt6ScpKL0ivSMXIn9Qt
+				DUlj0h7U7N48t3i8eC0GnMC91dX2sTivgloDTgUVeEGHLTizbf5Da9JLhkhh29QO
+				s1luMcScmBXTIIt7xRFxSBxnuJWfuAd1I7jntkyd/pgKaIwVr3MgmDo2q8x6IdB5
+				QH162mcX7ajtnHGN2bov71OU1+U0fqqoXLD0wX5ZM005UHmySz3qLtDqILDvIL+i
+				H6jB9y2x83ok898GOPQX3lk3Itl0A+BrD6D7tUjWh3fis58BXDigN9yF8M5PJH4B
+				8Gr79/F/XRm8m241mw/wvur4BGDj42bzn+Vmc+NL9L8GcMn8F1kAcXjEKMJAAAAA
+				CXBIWXMAAAsTAAALEwEAmpwYAAAgAElEQVR4nO1deXRURdb/db/uft2dxcQYIJAY
+				RQkBFKOOI0KCaBSQJcAICC5sgjgJzIjbcUT0zIgeWQQEQR00oDgoQvBoUCHKcpDV
+				gQTchgmiIhrggyYhSW/v9ev6/mhv5b303umgc07/zulD6H6v7q1bt27dunWrSgeA
+				IYEEEkgAgP63ZiCBBBL4/SBhEBJIIAGOhEFIIIEEOBIGIYEEEuBIGIQEEkiAw/Bb
+				M5BAAvGGIAia/yuK8htx8r8HHUIsO5rN5oDfM8bgdrvjzozBYIDB4G+jdDodFEWB
+				JElRl2kymaDX+xwhRVEgy3LUZQiCAKPRGPa51nwajUYYDAYw5i9iWZajVlRRFKHX
+				6wOWp4bL5Yqq3FB8ejweeDyeqMqLBKIoQqfTBfwtWv5Jb4K1L7VfLHobrA+EA2MM
+				Ho8nZmMUqc5Fi3DtGdIghILBYIi7ogiC0K7WvL3LjwZGoxFer/d3w08w/J7bmTqM
+				2ghYLBbe+Qlut5sbaUEQYDAY2mVACwTq2O1lWOONoAbBYDBgzJgx6NChA5xOJ8xm
+				MxRFgSiKOHr0KD7++GMA8XHHSOkuu+wyjBo1CpIkQa/Xw+v1wu1245JLLkFVVRWq
+				q6thNBojGuWpzKKiItxwww0QBAFbt26NqgxSXKvViqlTp0Kv18Pj8fCRjTEGnU7H
+				O3ZGRgY++eQTVFdXAwDy8vIwatQoNDY2cp4AwOv14t1334XNZouowxEfJSUlyM/P
+				h8Ph4LSJF6/XC5PJBJfLhVWrVkU0ypIc8vLyUFJSgvPnz8NkMnF6RqMRGzduxE8/
+				/RRXwyAIAoYPH46uXbvC7XZDr9dDkiTecVavXh2Wf7VBzc7OxuDBg3HTTTfhxhtv
+				REZGBjcIekGPA/8+gD179mD//v3YsWMHFEWBwWCATqcL6lEoigKz2YzJkydDEARI
+				kgSTyQSdTsdlryiKn0x0Oh0MBgOOHDmCQ4cOwW6387qYTCZ4vd6QclTr3OTJk6HT
+				6SKm3ZoHQRC4HLxeL4xGI95//30cP348ZHuy1h9BEBgAVlFRwRhjTJIkpobH42F5
+				eXkMADMYDH7vR/sxmUwMAFu+fDljjDG3281pORwOxhhjM2bMYACY2WyOuFyz2cy+
+				+uorXtby5csZAGY0GiN6n+RgtVrZN998w+seCMRnWVkZf7+goIAxxpjX6+XPybLM
+				GGNs/fr1mrpHIp+FCxf6yYdANOrr61lycrKG/3Dl3nTTTX51IxpLly6NmM9wH5J7
+				9+7d/eQYDf9UzuWXX85ef/11P/0Mha+++oqNGDGCiaIYVBeIblJSEvvhhx9Ctnsw
+				eL1e1tjYyPbt28cefvhhlpOTw/tLKP0j2ikpKez48eMa2bQFTqeTMcbYpEmTwvWj
+				4A1otVpZ79692ezZs5ndbmeSJLGGhgbGGGMvv/xyXBSFDEq3bt2YJEnM7Xaz5uZm
+				xhhjO3fuZMOGDWNXXHEFs1qtURsYUvTm5mYmyzKz2WwsIyMjos7S+iOKIrvooovY
+				Nddcw86ePctkWWaNjY2MMcY+++wzduWVV7K0tDS/xjabzeyyyy5ja9asYYwxZrfb
+				md1uZ4wxNnXqVF52pLJKSkpiGRkZbNasWczr9TKHw8Hq6+vZ9ddfz1JSUqIymOpP
+				p06d2NChQ9mOHTu4zNxuN5NlmRv/SA1puHZZunQpY4yxhoYGJkkSs9vtbM6cOez6
+				669nmZmZERmVSZMmcSWnTiNJEquqqmIzZszQfLZs2cINHHXsqqoqlp2dHdYopKam
+				smuvvZaVlZWx+vp6JkkS189t27axSZMmsQcffJBNmzaN/fnPf2Z///vf2e49u1lz
+				c7OmI0uSxBYuXMg6duwYVpax0J42bRqbPn06mzJlCps9ezb7+eefmSzLzOl0Mrfb
+				zerr6xljEQ2skVn1FStW8IqRYLt3795mRSElWbBgAWPMN4ISjXnz5mmeibbMF154
+				gfNMI/PYsWOj6oSt5ZCcnMyFSwoZjE9BEPh7WVlZ3ItQy7Fv374R8SMIgqa8q666
+				SjOqpqSkaJQp2g+Vm5+fz8slHuNh/Mnwd+3a1c/DcbvdLDc3V/NcqDKee+45P11Z
+				vnw569y5c0AeTSYTy87OZqtWrdK0myzLrF+/fiHrRvKMpt3NZjPLyMhgo0ePZvv2
+				7dMYIkmS2MCBAyNu82hpk5ysVisbMWIEl08UnnbohkxKSmIA2IwZM3jjUeVWrFjR
+				JkWhBs7NzeWjploRly1bFo75oEJMTU1lP/74I2PMN3oQz1u2bImJV3W5rRuH+AzU
+				wOr3bDYbryN1utraWtahQ4ewnUGt3ABYz549uZGrr69nqampEZcR6GM0GpnBYNDw
+				STx6PB7Wo0cP/lws5RPfzz//PNcjgizLLD8/P6QuEd2//e1v/H2q/1133cXrLggC
+				M5vNmo8gCFwus2bN0tB3OBysW7duQetG76WlpQVtd6vVymm15l8URfbQQw8xr9er
+				6TsTJkwIqjPR0hZFUVNfk8nE69K3b1/GGOP9a+bMmSH7VNjEJAoaqoNXtM77wAMP
+				oGfPnjwgFC1oOXDKlCmwWq08Esx+DYQQba/XG3GZFLjr06cPcnNzIcsydDod57mo
+				qAiXXnqp5tloEIgX4pOFWA5kjPH6UmBSlmV069YN5eXlES9vEX2Hw8H/VhSF/x2K
+				h3DlejweDZ/EoyAI+Mtf/hJTuYBPzpIkITs7G2VlZQB8ATY1KLgXiH+TyQRZlnHb
+				bbfh+eef521qMBgwd+5crFu3DhaLBYwxKIoCl8ul+VD7mM1mLF68GKtXr4bJZILD
+				4YDFYkF5eTmSkpICBhiJn0ABOCrX4/FwWurVDJPJBMYYlixZgpKSEv5/WZbx5ptv
+				YvTo0XC73X6yiJa22+3W1FeSJMiyDIvFgj179mDx4sWwWq0AEHSplxBxpiIxR/+S
+				ovz1r3+NiFBrkJJkZWVxZYvHuit1jDvvvBMAYLfbceLECQCA0+mExWLBiBEjOA8X
+				CmpFp+iv0WiEy+XC0KFDMXv2bHg8nqgMAynwoUOH4HQ6AbR91UfNJ600AMD06dPR
+				q1cvyLIcdTuRMZ44cSJSU1M5r5G+K0kSUlNT8dJLL/HvjUYjqqurMX/+fP5MqLqr
+				cwLmzp0LWZZhtVrhcrlQWFiIWbNmAfDlR8QDlI8iSRIsFgs2bdqE0tJSrnOKomD9
+				+vXo06cPX0WIN8iQrFmzBna7XfNdMERsEKjD07+kFNOmTcNVV10VtZdASnLfffch
+				LS0NTqczaqMSqExZlpGZmYnhw4cDAFauXIkXX3wRQIuxuPvuu/kS3YUCLRUBwH9r
+				/4vm5mYAvlFLlmU89dRTGDhwIFwuV0RKqSgKL6++vh6Kovhl6LUV5CnQiPzQQw9F
+				XQat+Xfo0IEPHtEoP3WgMWPGoGfPnhqFfv3119HU1ASj0RiRIZRlGSaTCceOHcNr
+				r70GoKWOTzzxBDp37gy32x33gcLpdMJoNOKNN97Atm3bNMvezz77LE+qihdID4hG
+				bW0tamtrAbSDh2C32/Hjjz8CACRJgk6nw7PPPqt5JhKGKb+AvIODBw/i3LlzAKKb
+				IqhBDXnLLbcgKysLALBjxw5s3LgRQEvWWZ8+fXDllVcCiI9XEinInXxv3Xt47rnn
+				APiy8oiHjRs3Ijc3F263Oyxf6mkCWf+2GlQqg5Tz+++/h91u5/kBU6dORb9+/XjH
+				igSknOPHj0dmZibq6upw4MABXodwcLvdMJvNKC0t5d8ZjUY4HA7ertHkR5CMPvnk
+				E16WJElISkrC2LFjAbSP50i5FnPnzgXg80Q8Hg9uu+023H777TzHJx5Qy9VoNMJu
+				t2Pq1KmYO3cudu3a5feMhs9IiVBnb2pqwhtvvMGJKYqCkSNHorCwEB6PJyJFIYHf
+				dddd6NKlCxRFwcKFC1FfX6+hFS1IMcaMGQMAOP1/p7F3716cOHECu3btgiAIcDgc
+				AFqmFDRCXAiQMl500UWYN28etm7dCrPZzN3ZpKQkvPHGG7BarUGNonpeSc9Q1l08
+				DAIAeBSfHD/++GPs2vU5gJbR5tFHHwUQmdEmw3/xxRdjxowZAIDNmzfjX//6FwCE
+				TUUnXerVqxeuu+46AC11rK6uhs1m8/EbhUGgZ7/44gs0NjZCp9NxHbjvvvsgimK7
+				eI7URvv27cOXX37JE9oA8OlKPLInTSYTkpOTeR+jdquursacOXNw+PBhzfetEfWU
+				ISMjAxUVFdi6dasm0+uRRx4BEF5RSEnS0tK4d7BlyxZs374dGRkZGlrRgNyu3Nxc
+				DBw4EADwztp3uJF5++23AbQYgJkzZyIlJQVutzvurnYw6PTaadeUKVN41hhNd4qL
+				i/GPf/wj7IjhVbxc1rHs8QgFr+Ir98yZM1i40DfdIvlGY/zV7j55ZCtWrOCZm+EM
+				P7VVUVERAJ8SU50rKiqiirkQaGRsbGzkbjShZ8+euOSSSzS8xxOiKMLpdGLdunUA
+				WvrKjTfeiA4dOrSJLslhzJgxaGpqQn5+PoAWo2o0GnladyhEPTyKooj6+nosXLgQ
+				QEuAbOTIkSgqKgqrKFThUaNGIS8vDwDw0ksvobGxsU3uO3XqwYMHIzU1FQDw6aef
+				8t83b94MSZL4iJyZmYkbb7xRw9OFAinlTz/9hPHjxwMAD9bJsoxHHnkEw4cPh9vt
+				DmoUPIoHilfRlBcvD4HKSU9Px2effYaamhrNPD0SL4EMf2pqKjf8e/buwcGDB3n7
+				hOOXRvOCggIA0GzsasucmwLaX3/9tYaW2WzGzTffzJ9pL3z55ZcAwKdiqampGDBg
+				QFR0W8f0SP9zc3MB+PZ0qCHLMpxOZ9iU/agNgizLSE5OxubNm/Hll19qAiTkJQRr
+				LFKS5ORkHqD6/PPPsXXrViQnJ7fJZaJgEM0DT548ic8/97m7BoMBx48fR1VVFX8W
+				AAYNGgQg9ilKrKBGtFgs2Lt3L0pLS7kcySi+9957yMvLC7ospeY53vyTJ0N058+f
+				z/lmjGHEiBHo379/SONPij1ixAj07NkTAPCiytuIBFR+jx49APgMAnkNdXV1AGKr
+				O3WeX375hX9Hxo1G6vYA0Thy5Ag8Hg8EQeBGr0uXLjGVpY4jdejQARMnTgQQ+1Q4
+				6rfUS1EvvPACAH9FURQloKKQIgwbNgy9e/cGACxatIhHyGNVbOKne/fu6Nu3LwBg
+				9erVPAJNwiFXjRRi8uTJSEtLgyRJF2zaoIbH44HRaMQrr7yCt99+m48YtLGmvLwc
+				KSkpvyl/AFBZWYlDhw5FZfzdbjesVis3/Lt27cKWLVsABJ+/qkH1NRgM6NSpE/+e
+				dOg///kPgNgD0AB4PIn9umEIAPde2mOQoDIbGxv9pnnp6elR0TWZTDAYDEhPT8cV
+				V1yB8ePHY8eOHdzrvmAGQR2Frqys9PMSHnvssaDbW91uNywWC1eSL774Aps3bwbg
+				U6xYXV6q/LBhw/hcatu2bZxfEv5nn30Gu93Ol/oyMjKidtXiDZLbzJkzUVNTA4PB
+				wHdV9uvXD//85z8B+B/6cSGgHn3mzZsHoMX4l5SU4Oabbw5o/Gmac8cdd/Bg4Isv
+				vshXQ6LpbHq9HklJSZrvQu30iwSkZ2p+6Lu0tLSoeYwUVKbL5fIziikpKRHRJdlO
+				mzYN586dw4kTJ3D06FGsXbsW+fn5bd6RGnVQEWhRlObmZo07qSgKhg0bhsLCQj9F
+				oYrcfvvtfO6+aNEiuFwufjhHrFaNDM24ceMAAIcPH8bu3bsBtATcDAYDTp06hY0b
+				KwC0dERKUvotziUgmZpMJjQ0NGDChAl89cBgMECWZYwbNw7jxo3jySsXkk/1/LSy
+				shLffvutxvg/+uijAY0/LRVS9PzQoUPYvHkz14FoDD9jjK96xBsXcsm5Nd3Wuh5r
+				YNjtdqO+vp6nALQVURsEvV6vIfzBBx/gyH+PaIJOgbwEWlt/+OGHAQCnTp3ia8Hq
+				MwaiBRmdgoICXHPNNQCADRs2wOl0IikpCaIo8g8AVFZuAqCNgHfu3Bkej+c38xIk
+				SYIoivj6668xbtw4nnlHne+dd97hGW2xnuATKQK1gyiKsNvtAY1/UVGRxviTnIuL
+				i9GvXz8A4OczRNMBSXcUReErRTQQ0SEnsYJGYXU6r9qdp+/iDSrTarX6yYJycMLR
+				pfjXypUrkZ6ejuzsbFx66aW4+uqrsXLlyjbrcMQGIRAhi8WC5uZmLJi/AECLogwd
+				OpTHEgwGA6/8rbfeyqO4ixcvRmNjY9wUvKSkBDqdDg6Hg8cKJEmC2+3mud4A8NFH
+				H+HHH3/kuexJSUkYOXJk0DrGC3q9Hnpdyx6B1qAVhYqKCixYsIDn7xNPr7zyCtLT
+				09s9uzIQn+SGbty4EUePHuWHkwD+xp+Cu+QdnD17lucdxOLduFwuHP81EU7NizrQ
+				GC2o89O8XW0QGhoa+HfxBvGalZXlp/cUz4iULqVqO51O2O12HDt2DA888ADX/Vin
+				DhFLM9Aclhq4oqICP/zwvUZRyJ2kzRyCIGDWLF/swGazYdWqVW1inHiiPHdavlMU
+				BUOGDEFpaSmmT5+OsrIylJWV4cEHH8SMGTMwYcIELnzqbGPHjoXBYGjXzqb2rNQn
+				LqlBORHPPPMMtm7dyuXp8XhQUFDA4wkE5o3/PFcQBD+lpNOYmpqasGDBAv49yZqM
+				Py11DRgwAMXFxQB8sQObzabRjUhBXsehQ75kGsYYL6Nz584AYuu4pLeUG6HW7VjO
+				3IwUZBAo8KdeVfrhhx8ARB67oLLoX/LMdu7c2SYeIx4SgxkEk8mE8+fPY/78BXjl
+				lVf496Qo27dvBwAUFhZi0KDBAHzewZkzZyCKYpuWGilZpl+/fsjNzYUkSUhJScGS
+				JUsiep8Ujt4/duxYxMerRQu1QQgVINTr9XA6nbj//vuxb98+HmGXZRmjR4/G9OnT
+				8dprr7VpVSZSPgnqwOz69esxe/ZsvpNUEAQ89thj2LlzJ5cb7Vk4d+4cN/yyLEft
+				DZKy19TUBP0tWqiPKOvVy7ccSgZPkiRs2uSbUrbH+YdkiPr06QPA1/kFQcC5c+f4
+				EnmkdANtNgR8mZCff/550AAuHcUWLDAbVqpUYLDTkNX5+SdOnPBzJ8kCkpKcP38e
+				5eXlANoudBLw+PHj+Hfnz5/HyZMng37q6upw7tw5TcTXYDDwaUO8o/mBYi+hErdk
+				WYYoijh+/Djuvvtu/h3l3L/66qvo06cPHA5HTEG6aPhs/ZsoimhoaPDzEu644w4U
+				FxfD4/HglltuweDBPsO/bNkynD59OuYcfdIPUnBagQF8qeexeHX0fk5ODi677HLN
+				b9988w1OnTqloR0vUCZqamoqRo0apfntgw8+wPnz59u0yUmdoty/f398++23mu+J
+				B5pGB6tfm2IIakU5V3+OZy8CPoHSstNVV13FhbBs2TKcPHkSoii2aYceHRKZk5OD
+				kSN9Ze/duxc5OTno3r170E+vXr3QsWNHLF26FECLwbv33nthNpvbbdogCAKvq9ks
+				ami3BsUTtm/fjlmzZvklLZWXlyM7O5vvmIynp6BO/mkNUqJ3330XdXV1fsYfAN/i
+				29jYiJUrVwKIfQWHAr11dXVYv349gJbAYkFBAS666CIA0Rlx9bkYOp1Osy16zZo1
+				fIUk3qD+U1xcjM6dO0NRFC7nd999V8NbW+kEK0dRFAwYMADDhg1DZmZmQJpRxxAC
+				jUakKGvXrsWpU6c0x2DPmTMHTz75JADfxqi2KklrfoYOHcrXcDds2ICmpibIsoym
+				pqaAH4fDAY/Hg/fffx8A+GnSBQUF3JVrj73p6pHXYvFFt0N1ZMpQXLJkCdatW6dJ
+				WurRowfeeuutdgmCBoohEGh/hc1m41vKqQ6FhYV44YUXUFhYCAB4+eWX8csvv/Bd
+				fbGCOs2rr74KoOWk6JSUFNx22238u0hBhpUy+gBfe9vt9jYH5IKBMnSTkpLw9NNP
+				cz4MBgOqqqqwdetW/kxbEeguCOorHTt2xIYNG1BZWYlbb70VgL/sIp4yhLJepChn
+				z57FokWLNO8NHTqUewevvvoqfvrpJ5hMpjYLnTrMvffeC8CXZPLhhx9yfohn9Uf9
+				24EDB/Ddd99ppj2kYO0BNQ9paWkR3U1Ao2FZWRm++eYbTeP169ePb8SJZ0Q80JRB
+				DfWhG2fOnOGnAImiiMcffxydOnWCJElxM/y0/Lp//368+eabmg11jz76KJKTk3ks
+				IxzI+BcXF6OwsFATpJw3bx7q6urabMACgdqtrKwMBQUFGm/vmWeeaZezLALRHzhw
+				IDIyMuBwOPDVV18B8G+fmKYMgUY2Kvitt96CzWbjoywZC1mW+aEUbUk3BVoqePXV
+				V/NU5f379/PcdFIYOkREfZgI8WO327F27VoALR3qgQceaLdUYfUxbtdeey2PyIei
+				Q7n8NpsN99xzDxhjmmBSW+UYCOEMAsnvzJkz3PjTASp0EtKKFSv40m48OhfV88kn
+				n8Tx48dhtVrhcDjwhz/8AY899hgPbofymGg62KFDBw3fJpMJu3fvxuLFiwHEZwsy
+				4OsvJpOJn4o1fvx4zJs3j8tDEASMHTsW+/bt4wHN9gDVOzMzE3PmzAHga8OzZ88C
+				8O/LYQ0CuWyUPqrT6XiHVCuOx+OBKIo4ffo0F64syzwt9LXXXsOxY8f8lITKD9SY
+				1Flaz2np2XvuuYfz8OGHH/I9AJHio48+AgDNDsj+/fsD8J82xMKn+jer1cr/VifW
+				hBvdKWnp8OHDuOeee/hOPfU+/nhAzSfxFqxeZFxXr16NhoYGLis6F5NWm/yULYQM
+				A+mUmp7JZEJdXR1Gjx4NxhgsFgtcLheefvppjBkzRnMsmyiKMJvNMJvN3DNzuVzI
+				yMjAhg0b0KNHD7hcLphMJjidTkyZMgXNzc0Bpx7UVoF4pvrQ7Uxqo+TxeHh26VNP
+				PYW1a9fC5XLx/jNlyhSsX78eoigGNQah5BWINiXg0WU7gC9onpqaijVr3kK3bt0A
+				+AwsyStqg0CNT8JSF9Z6hKJnV61axbczk2scTEmojEAjCeULqOkYDAY4nU7Nzi6H
+				w8GDTpGMSDQK1NTUYM/ePQBavIqhQ4cGLCdaPlu/p9frNQ0bycGsan5FUcQ777yD
+				pUuXcqOqPgy1rSA+1bdBBWtnMv6nTp3ixp+WucrLy1FbWxtw+TaYDEPpFIE614ED
+				BzBgwABu/GVZxnvvvYfly5cjKysLJpNJc+goLTGOHj0a1dXVKCoqgsvl4oPA7bff
+				jtraWp4I1hq0PBeo3akjK4rvTklJkvg26i5dumDSpEnYvXs3nn32WTDGYDab4fV6
+				cccdd2DVqlWc12AIpXOBaFMSHiUtpaSkYMiQIdi3bx8GDRqs8ZKD6V3IqFRaWho6
+				d+6Myy+/nO9O9Hq9mDRpEj7++GPU1tbyzC5iXBRF1NXVYdmyZZg9ezZ0Oh0++eQT
+				fPvtt3zpJRANKl99CWqfPn1QUlKCgwcP4tSpU1AUBenp6bj44osxefJkXHzxxXA6
+				nZAkib9vs9nCGgWLxYKOHTsiOzsb52wtx7ZJkoS7774b1dXV2L59O37++WfeYOnp
+				6ejSpUtQPkeMGIGDBw/i5MmTmlN+MzIykJWVhSFDhvCAj06nw/jx47F//3589913
+				vDOFAvHx5JNPoqCgAP3794fNZkNGRobfadXRwmw245JLLkFWVhY3iIDv4I5Ro0ah
+				pqYGdXV1mpGM6lheXo7HH3+cG6fW0zCCxWJBp06d0LFjR9x0000AWkZRj8eDiRMn
+				orKyEkePHuWrJ61BRmHnzp3Iz89HeXk5+vfvD8YYSktLMXnyZNQcqsFHmz5Cc3Mz
+				LBYL8vPzUVxcjJycHM632WzGp59+ivvvv58vlQcapQVBQLdu3ZCXl4e8vDwev6C6
+				FxYW4oknnuBxFLPZjPT0dNxwww3o3bu3xst0u91YunQpFi1ahNOnTwelqUYonSPa
+				FBdRw2g0IicnB0VFRejatSsUReHX/yUlJWHXrl1cxoFiPAHPZxcEgW3bto2fm98a
+				dL58UVGR5jx9Oks+JyeHnTlzJuAz9DGbzaympkZTXmvQBROlpaUMAPv5558DPk88
+				VlVVBT3nns6iHzt2LGMs8JVojLXcC7Fu3ToG+C7KqKurY4wFv1Yr0FVuhYWFQesW
+				y9VrdNZ+165dmc1m4+XSRSrR3plAdwIMHDhQI8NAcq2srPTjkdpz9uzZjDHGKioq
+				+IUyrWnceeedGtm2RR5UT7PZzP70pz+xw4cPh73ujH4/dOgQGz58eERXuVmt1piv
+				U5MkiZ0/f55t27aNzZw5k98SFelVbklJSezkyZMx0Q4G0vf58+cH7I8AWEAPgdy9
+				J554AgMGDEB9fT2/vpv9moqs1+thsVj4gatq98ZoNOLEiRMoKSnBH//4R/z73/8G
+				oN3RRcGWBx98EP3790dDQwOf/zPVJap0GOsXX3wBwJdm3LdvXzQ1NUEURT4qSpKE
+				5ORkngIaCOSdVFVVYcaMGfB6vTzYRzSBlnnXkSNHAPh2dU6cOBFXX301mpqagvKZ
+				mZmJvXv3AvCNLjU1NSgtLYVer9ecI8EY47EBtTsaLiJPQbDvv/8egwYNwi233AJF
+				UXgmH4vSQyC6u3fvDsgneU2pqan47rvv/N4nfpcsWQKXy8UvUlVvdCMaW7ZsQWlp
+				Kdch2uFKMqfVBHUGXTB5UJTe4/Fg48aN+OCDDzBgwADccMMN6NatG4YMGcLLFgQB
+				mzZtwtGjR7F//36+LZ722ASbJhgMBjgcDtx333247rrruMdBcqZsv9Y8GgwG2Gw2
+				VFdX4/Tp05p9NHTZa6hMWFpxsNvtmDBhAnr37q3Z8xOKthqUT0KxBPbr9fSpqalc
+				BoH0Jebr4MOBYge0rv2/cBX2/wqoM/0WW7YDgdr6QvNFAT/12rsgCLBarZoNSw6H
+				Q/P7hbwOngKSweIQvzeENAgUrQw18oSqqMlkgl6vD5n9FwkNsog0hwwXXQ+XbUiR
+				2XBgjHHFIQ8pFP1vfIcAAACDSURBVNR8RkMnluxItRxoJI8VkfCplkWw9ynAFSsN
+				QlvkEUgfqVPGIqdI2j0QFEXh19XHilhph0Oodmo3DyGBBH4rtM7t+L14Uv8LSBiE
+				BBJIgOPC3VKSQAIJ/O6RMAgJJJAAR8IgJJBAAhwJg5BAAglwJAxCAgkkwJEwCAkk
+				kADH/wN2bjbTsOrFbgAAAABJRU5ErkJggg==
+		</image>
+	</surface>
+	</OBJECT-3D>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webGL/xml/press.xml	Wed Apr 25 23:45:59 2012 +0900
@@ -0,0 +1,240 @@
+<?xml version="1.0"?>
+<OBJECT-3D>
+	<surface name="press" size="6" prim="Triangle" parent="NULL">
+		<coordinate>
+			-34.999996 -6.500000 0.000000
+			34.999994 -6.500000 0.000000
+			35.000006 6.500000 0.000000
+			35.000006 6.500000 0.000000
+			-35.000004 6.500000 0.000000
+			-34.999996 -6.500000 0.000000
+		</coordinate>
+		<normal>
+			0.000000 0.000000 1.000000
+			0.000000 0.000000 1.000000
+			0.000000 0.000000 1.000000
+			0.000000 0.000000 1.000000
+			0.000000 0.000000 1.000000
+			0.000000 0.000000 1.000000
+		</normal>
+		<model>
+			0.000000 0.000000 0.000000
+		</model>
+		<texture>
+			0.000000 0.000000
+			1.000000 0.000000
+			1.000000 1.000000
+			1.000000 1.000000
+			0.000000 1.000000
+			0.000000 0.000000
+		</texture>
+		<image name="press.png">
+				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
+				AElFTkSuQmCC
+		</image>
+	</surface>
+	</OBJECT-3D>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webGL/xml/title.xml	Wed Apr 25 23:45:59 2012 +0900
@@ -0,0 +1,309 @@
+<?xml version="1.0"?>
+<OBJECT-3D>
+	<surface name="title" size="6" prim="Triangle" parent="NULL">
+		<coordinate>
+			-44.999996 -10.000000 0.000000
+			44.999994 -10.000000 0.000000
+			45.000006 10.000000 0.000000
+			45.000006 10.000000 0.000000
+			-45.000004 10.000000 0.000000
+			-44.999996 -10.000000 0.000000
+		</coordinate>
+		<normal>
+			0.000000 0.000000 1.000000
+			0.000000 0.000000 1.000000
+			0.000000 0.000000 1.000000
+			0.000000 0.000000 1.000000
+			0.000000 0.000000 1.000000
+			0.000000 0.000000 1.000000
+		</normal>
+		<model>
+			0.000000 0.000000 0.000000
+		</model>
+		<texture>
+			0.000000 0.000000
+			1.000000 0.000000
+			1.000000 1.000000
+			1.000000 1.000000
+			0.000000 1.000000
+			0.000000 0.000000
+		</texture>
+		<image name="title.png">
+				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
+				vvlm2P7Mk5KSqG/fvnTvvffSc889F1QOvF4vlZWV1QkVFRX0448/EhHRb37zm7Dy
+				qdVqRZo6depEjz76KO3bt6+Ow5zA91utVlq7di3dfffdlJycLOKq79RDU+qBt99+
+				208PRBii05ldSWXM7yooKCAif3eB/PdDDz1URxC4MOfMmVPnOXa3yekuKSkhg8Eg
+				KnbixInid16vl2w2m3BzyJXIXpG0Wm0dRyXcWJxOJ7lcLnFcYObMmfUKrEajoa1b
+				tzY4Ps5Du3btRP6CEdhZsFBNnTpVNHKXy0WVlZVUXl5O5eXlVF1dTQ6Hw69jcLlc
+				NGzYMFEWvv/27NmTTp48SUSXjg1VVVVRWVmZiIsbPr9v48aNlJaW5pePpggsG2PH
+				jiUiCtowbTYbjR8/3u/CkkiUMju3CdUhAaAuXboE7YRY7liJhpKbq6Wu165dK97P
+				5ROr9hVuX9hQZcxlYTabae7cuSJ9wRQvw/2Sw+EQedq9eze1bds2aB/M/09KSqKz
+				5876yX2kRJJPbj8prVLo5Zdf9lP89b3f9/vKykq6//77xbsud/TvSuqBSPqgZrdM
+				DdQaxnz55ZcAave4gNo9vxtuuAGA/1Ig/f/ehtFoFL/l4yZsqMNLk99++61Ymhgz
+				Zgw++OAD2O12cXGF7zVpHO/UqVPx/PPPo7q6Oug1ar77L3q9HkBdo4dgqFQqER8v
+				BTUkPp1O53ctIBGJsvNdYuL8OBwOPPHEE5g7dy7sdrson8TExDp5Y/hChc2bN2PQ
+				oEHYtWuXWNrt2rUrNm3ahPT0dLG86Vt3gXHZbDYMHz4cn332GUaOHImKioomc1DP
+				F5OsX78eBw4cQFZWlrCA5j04jUaDFStWoKioCAUFBdi9ezcURYFWqw1673Ag4aTb
+				9/5bj8cjlsu5fvhoSX1y09LrOvD4Yjy0r6aAl+1TUlKwYsUKDBs2TNjJKIqCkpIS
+				LFu2DDabDUQEk8mEyZMno1evXn5Lx1arFf369cOCBQtwxx13hHwfEcHtcqOqqgo1
+				NTVQK2qktUmrswRNRCgvL6/zvKIoqKmpgdForPeqW76QZeDAgVi+fDnat28PIoLN
+				ZoNOp4OiKLhw4QIWLFiAU6dOibLo1KkTpk6dipSUFLGvbLFYsGDBAtx7772YPHky
+				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
+				AAAAAElFTkSuQmCC
+		</image>
+	</surface>
+	</OBJECT-3D>
\ No newline at end of file