1.1 --- a/scripts/machine.js Mon Apr 25 23:30:26 2011 +0200
1.2 +++ b/scripts/machine.js Tue Apr 26 01:48:56 2011 +0200
1.3 @@ -10,6 +10,8 @@
1.4 var mouseActionMap = {"pitch": [[true, false, false], pitchCamera],
1.5 "yaw": [[true, false, false], yawCamera],
1.6 "wheel": zoomCamera};
1.7 +include("scripts/cube.js");
1.8 +include("scripts/renderer.js");
1.9
1.10 function main()
1.11 {
1.12 @@ -244,58 +246,7 @@
1.13 }
1.14 }
1.15
1.16 -function Renderer(camera, context)
1.17 -{
1.18 - this.camera = camera;
1.19 - this.context = context;
1.20 - this.gl = context.gl;
1.21 - this.matrixStack = [];
1.22 -}
1.23 -Renderer.prototype.update = function(scene)
1.24 -{
1.25 - var gl = this.context.gl;
1.26 - var viewport = this.context.viewport;
1.27 - var shader = this.context.shader;
1.28 - var mvMatrix = this.context.mvMatrix;
1.29 - var pMatrix = this.context.pMatrix;
1.30 - var camera = this.camera;
1.31 - camera.update();
1.32
1.33 - gl.viewport(0, 0, viewport.width, viewport.height);
1.34 - gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
1.35 - mat4.perspective(45, viewport.width / viewport.height, 0.1, 100.0, pMatrix);
1.36 -
1.37 - mat4.identity(mvMatrix);
1.38 - mat4.multiply(mvMatrix, camera.matrix);
1.39 -
1.40 - //this.pushMatrix(mvMatrix);
1.41 -
1.42 - gl.bindBuffer(gl.ARRAY_BUFFER, scene.positionBuffer);
1.43 - gl.vertexAttribPointer(shader.vertexPosition, scene.positionBuffer.itemSize, gl.FLOAT, false, 0, 0);
1.44 -
1.45 - gl.bindBuffer(gl.ARRAY_BUFFER, scene.colourBuffer);
1.46 - gl.vertexAttribPointer(shader.vertexColour, scene.colourBuffer.itemSize, gl.FLOAT, false, 0, 0);
1.47 -
1.48 - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, scene.indexBuffer);
1.49 -
1.50 - this.context.updateMatrixUniforms();
1.51 - gl.drawElements(gl.TRIANGLES, scene.indexBuffer.numItems, gl.UNSIGNED_SHORT, 0);
1.52 - //gl.drawArrays(gl.TRIANGLE_STRIP, 0, scene.positionBuffer.numItems);
1.53 -
1.54 - //mvMatrix = this.popMatrix();
1.55 -
1.56 - if (this.next) this.next.draw(scene);
1.57 -}
1.58 -Renderer.prototype.pushMatrix = function(matrix)
1.59 -{
1.60 - var copy = mat4.create();
1.61 - mat4.set(matrix, copy);
1.62 - this.matrixStack.push(copy);
1.63 -}
1.64 -Renderer.prototype.popMatrix = function()
1.65 -{
1.66 - if (this.matrixStack.length > 0) return this.matrixStack.pop();
1.67 -}
1.68
1.69 function Machine(scene)
1.70 {
1.71 @@ -312,184 +263,10 @@
1.72 this.lastUpdate = time;
1.73 }
1.74
1.75 -function Context(canvas)
1.76 -{
1.77 - this.canvas = canvas;
1.78 - try
1.79 - {
1.80 - this.gl = canvas.getContext("experimental-webgl");
1.81 - this.viewport = {'width': canvas.width,
1.82 - 'height': canvas.height};
1.83 - }
1.84 - catch(e)
1.85 - {
1.86 - alert(e);
1.87 - }
1.88 - if (!this.gl) alert("Failed: WebGL init.");
1.89 - this.mvMatrix = mat4.create();
1.90 - this.pMatrix = mat4.create();
1.91 - this.shader = new Shader(this);
1.92 -}
1.93 -Context.prototype.updateMatrixUniforms = function()
1.94 -{
1.95 - var gl = this.gl;
1.96 - var program = this.shader;
1.97 - var pMatrix = this.pMatrix;
1.98 - var mvMatrix = this.mvMatrix;
1.99 - gl.uniformMatrix4fv(program.pMatrixUniform, false, pMatrix);
1.100 - gl.uniformMatrix4fv(program.mvMatrixUniform, false, mvMatrix);
1.101 -}
1.102 -Context.prototype.expand = function()
1.103 -{
1.104 - var width = window.innerWidth;
1.105 - var height = window.innerHeight;
1.106 - this.canvas.width = width;
1.107 - this.canvas.height = height;
1.108 - this.viewport.width = width;
1.109 - this.viewport.height = height;
1.110 -}
1.111
1.112 -function Shader(context)
1.113 -{
1.114 - var gl = context.gl;
1.115 - var fragment = loadShader(gl, "fragment-shader");
1.116 - var vertex = loadShader(gl, "vertex-shader");
1.117 - this.program = gl.createProgram();
1.118 - gl.attachShader(this.program, vertex);
1.119 - gl.attachShader(this.program, fragment);
1.120 - gl.linkProgram(this.program);
1.121
1.122 - if (!gl.getProgramParameter(this.program, gl.LINK_STATUS))
1.123 - {
1.124 - alert("Failed: Shader init.");
1.125 - }
1.126
1.127 - gl.useProgram(this.program);
1.128 - this.vertexPosition = gl.getAttribLocation(this.program, "aVertexPosition");
1.129 - gl.enableVertexAttribArray(this.vertexPosition);
1.130 -
1.131 - this.vertexColour = gl.getAttribLocation(this.program, "aVertexColour");
1.132 - gl.enableVertexAttribArray(this.vertexColour);
1.133
1.134 - this.pMatrixUniform = gl.getUniformLocation(this.program, "uPMatrix");
1.135 - this.mvMatrixUniform = gl.getUniformLocation(this.program, "uMVMatrix");
1.136 -
1.137 - function loadShader(gl, id)
1.138 - {
1.139 - var script = document.getElementById(id);
1.140 - if (!script) return null;
1.141 -
1.142 - var str = "";
1.143 - var child = script.firstChild;
1.144 - while (child)
1.145 - {
1.146 - if (child.nodeType == 3) str += child.textContent;
1.147 - child = child.nextSibling;
1.148 - }
1.149 -
1.150 - var shader;
1.151 - var common = "x-shader/x-";
1.152 - if (script.type == common + "fragment") shader = gl.createShader(gl.FRAGMENT_SHADER);
1.153 - else if (script.type == common + "vertex") shader = gl.createShader(gl.VERTEX_SHADER);
1.154 - else return null;
1.155 -
1.156 - gl.shaderSource(shader, str);
1.157 - gl.compileShader(shader);
1.158 -
1.159 - if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS))
1.160 - {
1.161 - alert(gl.getShaderInfoLog(shader));
1.162 - return null;
1.163 - }
1.164 -
1.165 - return shader;
1.166 - }
1.167 -}
1.168 -
1.169 -
1.170 -function Cube(size, context)
1.171 -{
1.172 - var gl = context.gl;
1.173 - this.size = size || 1;
1.174 - this.rotation = {'x': 0.0, 'y': 0.0, 'z': 0.0};
1.175 -
1.176 - this.positionBuffer = gl.createBuffer();
1.177 - gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);
1.178 - var vertices = [
1.179 - // Front face
1.180 - -1.0, -1.0, 1.0,
1.181 - 1.0, -1.0, 1.0,
1.182 - 1.0, 1.0, 1.0,
1.183 - -1.0, 1.0, 1.0,
1.184 -
1.185 - // Back face
1.186 - -1.0, -1.0, -1.0,
1.187 - -1.0, 1.0, -1.0,
1.188 - 1.0, 1.0, -1.0,
1.189 - 1.0, -1.0, -1.0,
1.190 -
1.191 - // Top face
1.192 - -1.0, 1.0, -1.0,
1.193 - -1.0, 1.0, 1.0,
1.194 - 1.0, 1.0, 1.0,
1.195 - 1.0, 1.0, -1.0,
1.196 -
1.197 - // Bottom face
1.198 - -1.0, -1.0, -1.0,
1.199 - 1.0, -1.0, -1.0,
1.200 - 1.0, -1.0, 1.0,
1.201 - -1.0, -1.0, 1.0,
1.202 -
1.203 - // Right face
1.204 - 1.0, -1.0, -1.0,
1.205 - 1.0, 1.0, -1.0,
1.206 - 1.0, 1.0, 1.0,
1.207 - 1.0, -1.0, 1.0,
1.208 -
1.209 - // Left face
1.210 - -1.0, -1.0, -1.0,
1.211 - -1.0, -1.0, 1.0,
1.212 - -1.0, 1.0, 1.0,
1.213 - -1.0, 1.0, -1.0];
1.214 - gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
1.215 - this.positionBuffer.itemSize = 3;
1.216 - this.positionBuffer.numItems = 24;
1.217 -
1.218 - this.colourBuffer = gl.createBuffer();
1.219 - gl.bindBuffer(gl.ARRAY_BUFFER, this.colourBuffer);
1.220 - var alpha = 1.0;
1.221 - var colours = [[1.0, 0.0, 0.0, alpha],
1.222 - [0.0, 1.0, 0.0, alpha],
1.223 - [0.0, 0.0, 1.0, alpha],
1.224 - [1.0, 0.0, 1.0, alpha],
1.225 - [1.0, 1.0, 0.0, alpha],
1.226 - [0.0, 1.0, 1.0, alpha]];
1.227 - var unpackedColours = [];
1.228 - for (var i in colours)
1.229 - {
1.230 - var colour = colours[i];
1.231 - for (var j = 0; j < 4; j++)
1.232 - {
1.233 - unpackedColours = unpackedColours.concat(colour);
1.234 - }
1.235 - //colours = colours.concat([0.5, 0.5, 1.0, 1.0]);
1.236 - }
1.237 - gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(unpackedColours), gl.STATIC_DRAW);
1.238 - this.colourBuffer.itemSize = 4;
1.239 - this.colourBuffer.numItems = 24;
1.240 -
1.241 - this.indexBuffer = gl.createBuffer();
1.242 - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);
1.243 - var indices = [0, 1, 2, 0, 2, 3,
1.244 - 4, 5, 6, 4, 6, 7,
1.245 - 8, 9, 10, 8, 10, 11,
1.246 - 12, 13, 14, 12, 14, 15,
1.247 - 16, 17, 18, 16, 18, 19,
1.248 - 20, 21, 22, 20, 22, 23];
1.249 - gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
1.250 - this.indexBuffer.itemSize = 1;
1.251 - this.indexBuffer.numItems = 36;
1.252 -}
1.253
1.254 function read(file, handler)
1.255 {