scripts/machine.js
author Eugen Sawin <sawine@me73.com>
Mon, 18 Apr 2011 15:30:47 +0200
changeset 18 92eb274bc564
parent 17 8b187fa957ad
child 19 15d61d76daa1
permissions -rwxr-xr-x
Still bugged camera.
sawine@2
     1
var machine;
sawine@8
     2
var renderer;
sawine@11
     3
var controller;
sawine@11
     4
var camera;
sawine@14
     5
var cameraSpeed = {"x": 0.1, "y": 0.1, "z": 0.5, "pitch": 0.5, "yaw": 0.5};
sawine@13
     6
var keyActionMap = {'A': moveCameraLeft,
sawine@13
     7
		 'D': moveCameraRight,
sawine@13
     8
		 'W': moveCameraUp,
sawine@13
     9
		 'S': moveCameraDown};
sawine@14
    10
var mouseActionMap = {"pitch": [[true, false, false], pitchCamera],
sawine@14
    11
		      "yaw": [[true, false, false], yawCamera],
sawine@14
    12
                      "wheel": zoomCamera};
sawine@2
    13
sawine@2
    14
function main()
sawine@2
    15
{
sawine@2
    16
    var canvas = document.getElementById("machine");
sawine@2
    17
    var context = new Context(canvas);
sawine@10
    18
    context.expand();
sawine@2
    19
    var gl = context.gl;
sawine@7
    20
    var object = new Cube(1, context);
sawine@2
    21
    gl.clearColor(0.0, 0.0, 0.0, 1.0);
sawine@2
    22
    gl.enable(gl.DEPTH_TEST);
sawine@11
    23
    machine = new Machine(object);       
sawine@12
    24
    camera = new Camera(cameraSpeed);
sawine@11
    25
    renderer = new Renderer(camera, context);
sawine@13
    26
    controller = new Controller(keyActionMap, mouseActionMap, camera, machine, renderer);
sawine@6
    27
    update();
sawine@13
    28
    window.onresize = expandContext;
sawine@13
    29
    document.onkeydown = handleKeyDown;
sawine@13
    30
    document.onkeyup = handleKeyUp;
sawine@13
    31
    canvas.onmousedown = handleMouseDown;
sawine@13
    32
    document.onmouseup = handleMouseUp;
sawine@13
    33
    document.onmousemove = handleMouseMove;
sawine@14
    34
    document.onmousewheel = handleMouseWheel;
sawine@13
    35
    //read("config/camera", configureCamera);
sawine@13
    36
}
sawine@13
    37
sawine@13
    38
function configureCamera(config) {
sawine@13
    39
    alert(config);
sawine@6
    40
}
sawine@6
    41
sawine@6
    42
function update()
sawine@6
    43
{    
sawine@7
    44
    requestAnimFrame(update);
sawine@11
    45
    controller.update();
sawine@10
    46
    machine.scene.rotation.x += (random(0, 2) - 2) * 0.001; 
sawine@10
    47
    machine.scene.rotation.y += (random(0, 3) - 1) * 0.001; 
sawine@10
    48
    machine.scene.rotation.z += (random(0, 2) - 1) * 0.001;
sawine@8
    49
    machine.update(new Date().getTime());
sawine@8
    50
    renderer.update(machine.scene);
sawine@2
    51
}
sawine@2
    52
sawine@9
    53
function random(min, max)
sawine@9
    54
{
sawine@10
    55
    return (min + Math.random() * (max - min));
sawine@9
    56
}
sawine@9
    57
sawine@12
    58
function Camera(speed)
sawine@4
    59
{
sawine@11
    60
    this.x = 0.0;
sawine@11
    61
    this.y = 0.0;
sawine@13
    62
    this.z = 7.0;
sawine@13
    63
    this.pitch = 0.0;
sawine@13
    64
    this.yaw = 0.0;
sawine@12
    65
    this.speed = speed;
sawine@15
    66
    this.rotMatrix = mat4.create();
sawine@15
    67
    this.transMatrix = mat4.create();
sawine@16
    68
    this.matrix = mat4.create();
sawine@15
    69
    mat4.identity(this.rotMatrix);
sawine@15
    70
    mat4.identity(this.transMatrix);
sawine@16
    71
    mat4.identity(this.matrix);
sawine@11
    72
}
sawine@11
    73
Camera.prototype.moveLeft = function()
sawine@11
    74
{
sawine@18
    75
    var d = 1 - Math.sin(this.yaw);
sawine@18
    76
    this.x -= d * this.speed.x;
sawine@18
    77
    this.z += (1 - d) * this.speed.z;
sawine@11
    78
}
sawine@11
    79
Camera.prototype.moveRight = function()
sawine@11
    80
{
sawine@18
    81
    var d = 1 - Math.sin(this.yaw);
sawine@18
    82
    this.x += d * this.speed.x;
sawine@18
    83
    this.z -= (1 - d) * this.speed.z;
sawine@11
    84
}
sawine@11
    85
Camera.prototype.moveUp = function()
sawine@11
    86
{
sawine@13
    87
    this.y += this.speed.y;
sawine@11
    88
}
sawine@11
    89
Camera.prototype.moveDown = function()
sawine@11
    90
{
sawine@13
    91
    this.y -= this.speed.y;
sawine@13
    92
}
sawine@14
    93
Camera.prototype.zoom = function(delta) 
sawine@13
    94
{
sawine@18
    95
    this.x -= Math.sin(this.yaw) * this.speed.x * delta;
sawine@18
    96
    this.y -= Math.sin(this.pitch) * this.speed.y * delta;
sawine@18
    97
    this.z -= Math.cos(this.yaw) * Math.cos(this.pitch) * this.speed.z * delta;
sawine@13
    98
}
sawine@13
    99
Camera.prototype.changePitch = function(delta)
sawine@13
   100
{
sawine@13
   101
    this.pitch += this.speed.pitch * delta;
sawine@13
   102
}
sawine@13
   103
Camera.prototype.changeYaw = function(delta)
sawine@13
   104
{
sawine@13
   105
    this.yaw += this.speed.yaw * delta;
sawine@12
   106
}
sawine@15
   107
Camera.prototype.update = function()
sawine@15
   108
{
sawine@16
   109
    //mat4.rotate(this.rotMatrix, -this.pitch, [1, 0, 0]);
sawine@16
   110
    //mat4.rotate(this.rotMatrix, -this.yaw, [0, 1, 0]);
sawine@16
   111
    //mat4.translate(this.transMatrix, [-this.x, -this.y, -this.z]);
sawine@16
   112
    mat4.translate(this.matrix, [-this.x, -this.y, -this.z]);
sawine@16
   113
    //mat4.rotate(this.matrix, -this.pitch, [1, 0, 0]);
sawine@16
   114
    //mat4.rotate(this.matrix, -this.yaw, [0, 1, 0]);
sawine@16
   115
    
sawine@16
   116
    
sawine@15
   117
    this.clear();
sawine@15
   118
    //mat4.rotate(mvMatrix, -camera.pitch, [1, 0, 0]);
sawine@15
   119
    //mat4.rotate(mvMatrix, -camera.yaw, [0, 1, 0]);
sawine@15
   120
    //mat4.translate(mvMatrix, [-camera.x, -camera.y, -camera.z]);
sawine@15
   121
}
sawine@15
   122
Camera.prototype.clear = function()
sawine@15
   123
{
sawine@17
   124
    //this.x = this.y = this.z = 0;
sawine@16
   125
   //this.pitch = this.yaw = 0;
sawine@15
   126
}
sawine@12
   127
sawine@13
   128
function Controller(keyActionMap, mouseActionMap, camera, machine, renderer)
sawine@11
   129
{ 
sawine@13
   130
    this.keyboard = new Keyboard(keyActionMap);
sawine@13
   131
    this.mouse = new Mouse(mouseActionMap);
sawine@11
   132
   
sawine@11
   133
}
sawine@11
   134
Controller.prototype.update = function()
sawine@11
   135
{
sawine@11
   136
    this.keyboard.handle();
sawine@13
   137
    this.mouse.handle();
sawine@11
   138
}
sawine@11
   139
sawine@13
   140
function Mouse(actionMap)
sawine@11
   141
{
sawine@13
   142
    this.actionMap = actionMap;
sawine@14
   143
    this.pressed = [false, false, false];   
sawine@14
   144
    this.wheelDelta = 0;
sawine@11
   145
}
sawine@13
   146
Mouse.prototype.buttonDown = function(event)
sawine@13
   147
{
sawine@13
   148
    this.pressed[event.which-1] = true;
sawine@13
   149
}
sawine@13
   150
Mouse.prototype.buttonUp = function(event)
sawine@13
   151
{
sawine@13
   152
    this.pressed[event.which-1] = false;
sawine@13
   153
}
sawine@13
   154
Mouse.prototype.move = function(event)
sawine@13
   155
{
sawine@14
   156
    this.currentPos = [event.clientX, event.clientY];
sawine@14
   157
}
sawine@14
   158
Mouse.prototype.moveWheel = function(event)
sawine@14
   159
{ 
sawine@14
   160
    this.wheelDelta += event.wheelDelta;
sawine@14
   161
}
sawine@14
   162
Mouse.prototype.handle = function()
sawine@14
   163
{
sawine@14
   164
    var pos = this.currentPos;
sawine@14
   165
    if (pos && this.lastPos)
sawine@13
   166
    {
sawine@13
   167
	var delta = [pos[0] - this.lastPos[0], pos[1] - this.lastPos[1]];
sawine@14
   168
	delta = normaliseMoveDelta(delta);
sawine@13
   169
	var action = this.actionMap["pitch"];
sawine@13
   170
	if (delta[1] != 0 && action) 
sawine@13
   171
	{
sawine@13
   172
	    for (var i = 0; i < 3; i++)
sawine@13
   173
	    {
sawine@13
   174
		if (this.pressed[i] != action[0][i]) break;
sawine@13
   175
		if (i == 2) action[1](delta[1]);
sawine@13
   176
	    }
sawine@13
   177
	} 
sawine@13
   178
	action = this.actionMap["yaw"];
sawine@13
   179
	if (delta[0] != 0 && action) 
sawine@13
   180
	{
sawine@13
   181
	    for (var i = 0; i < 3; i++)
sawine@13
   182
	    {
sawine@13
   183
		if (this.pressed[i] != action[0][i]) break;
sawine@13
   184
		if (i == 2) action[1](delta[0]);
sawine@13
   185
	    }
sawine@13
   186
	}
sawine@13
   187
    }
sawine@13
   188
    this.lastPos = pos;
sawine@14
   189
    
sawine@14
   190
    if (this.wheelDelta != 0)
sawine@14
   191
    {
sawine@14
   192
	var delta = normaliseWheelDelta(this.wheelDelta);
sawine@14
   193
	var action = this.actionMap["wheel"];
sawine@14
   194
	if (delta > 0 && action) action(delta);
sawine@14
   195
	else if (delta < 0 && action) action(delta);
sawine@14
   196
	this.wheelDelta = 0;
sawine@14
   197
    }
sawine@14
   198
    
sawine@13
   199
}
sawine@13
   200
sawine@14
   201
function normaliseMoveDelta(delta)
sawine@13
   202
{
sawine@13
   203
    var width = renderer.context.canvas.width;
sawine@13
   204
    var height = renderer.context.canvas.height;
sawine@13
   205
    return [delta[0] / width, delta[1] / height];
sawine@13
   206
}
sawine@13
   207
sawine@14
   208
function normaliseWheelDelta(delta)
sawine@14
   209
{
sawine@14
   210
    return delta / 60;
sawine@14
   211
}
sawine@14
   212
sawine@11
   213
function Keyboard(actionMap)
sawine@11
   214
{
sawine@11
   215
    this.actionMap = actionMap;
sawine@11
   216
    this.pressed = {};
sawine@11
   217
}
sawine@11
   218
Keyboard.prototype.keyDown = function(event)
sawine@11
   219
{
sawine@11
   220
    this.pressed[event.keyCode] = true;    
sawine@11
   221
}
sawine@11
   222
Keyboard.prototype.keyUp = function(event)
sawine@11
   223
{
sawine@11
   224
    this.pressed[event.keyCode] = false;
sawine@11
   225
}
sawine@11
   226
Keyboard.prototype.handle = function()
sawine@11
   227
{
sawine@11
   228
    for (key in this.pressed)
sawine@11
   229
    {
sawine@11
   230
	if (this.pressed[key])
sawine@11
   231
	{
sawine@11
   232
	    key = String.fromCharCode(key);
sawine@11
   233
	    if (this.actionMap[key]) this.actionMap[key](); 
sawine@11
   234
	}
sawine@11
   235
    }
sawine@11
   236
}
sawine@11
   237
sawine@11
   238
function Renderer(camera, context)
sawine@11
   239
{
sawine@11
   240
    this.camera = camera;
sawine@4
   241
    this.context = context;
sawine@4
   242
    this.gl = context.gl;
sawine@7
   243
    this.matrixStack = [];
sawine@4
   244
}
sawine@8
   245
Renderer.prototype.update = function(scene)
sawine@5
   246
{ 
sawine@5
   247
    var gl = this.context.gl;
sawine@5
   248
    var viewport = this.context.viewport;
sawine@5
   249
    var shader = this.context.shader;
sawine@5
   250
    var mvMatrix = this.context.mvMatrix;
sawine@5
   251
    var pMatrix = this.context.pMatrix;
sawine@13
   252
    var camera = this.camera;
sawine@15
   253
    camera.update();
sawine@5
   254
sawine@5
   255
    gl.viewport(0, 0, viewport.width, viewport.height);
sawine@5
   256
    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
sawine@18
   257
    mat4.perspective(45, viewport.width / viewport.height, 0.1, 100.0, pMatrix);
sawine@5
   258
sawine@5
   259
    mat4.identity(mvMatrix);
sawine@16
   260
    //mat4.multiply(mvMatrix, camera.rotMatrix);
sawine@16
   261
    //mat4.multiply(mvMatrix, camera.transMatrix);
sawine@16
   262
    mat4.rotate(mvMatrix, -camera.pitch, [1, 0, 0]);
sawine@16
   263
    mat4.rotate(mvMatrix, -camera.yaw, [0, 1, 0]);
sawine@17
   264
    mat4.translate(mvMatrix, [-camera.x, -camera.y, -camera.z]);
sawine@17
   265
    //mat4.multiply(mvMatrix, camera.matrix);
sawine@16
   266
    //mat4.rotate(camera.matrix, -camera.pitch, [1, 0, 0]);
sawine@16
   267
    //mat4.rotate(camera.matrix, -camera.yaw, [0, 1, 0]);
sawine@16
   268
    //camera.yaw = camera.pitch = 0;
sawine@16
   269
   
sawine@15
   270
    
sawine@17
   271
    //this.pushMatrix(mvMatrix);
sawine@7
   272
sawine@17
   273
    //mat4.rotate(mvMatrix, scene.rotation.x, [1, 0, 0]);
sawine@17
   274
    //mat4.rotate(mvMatrix, scene.rotation.y, [0, 1, 0]);
sawine@17
   275
    //mat4.rotate(mvMatrix, scene.rotation.z, [0, 0, 1]);
sawine@7
   276
sawine@5
   277
    gl.bindBuffer(gl.ARRAY_BUFFER, scene.positionBuffer);
sawine@5
   278
    gl.vertexAttribPointer(shader.vertexPosition, scene.positionBuffer.itemSize, gl.FLOAT, false, 0, 0);
sawine@5
   279
sawine@5
   280
    gl.bindBuffer(gl.ARRAY_BUFFER, scene.colourBuffer);
sawine@5
   281
    gl.vertexAttribPointer(shader.vertexColour, scene.colourBuffer.itemSize, gl.FLOAT, false, 0, 0);
sawine@9
   282
    
sawine@9
   283
    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, scene.indexBuffer);
sawine@17
   284
sawine@5
   285
    this.context.updateMatrixUniforms();
sawine@9
   286
    gl.drawElements(gl.TRIANGLES, scene.indexBuffer.numItems, gl.UNSIGNED_SHORT, 0);
sawine@9
   287
    //gl.drawArrays(gl.TRIANGLE_STRIP, 0, scene.positionBuffer.numItems);
sawine@7
   288
    
sawine@17
   289
    //mvMatrix = this.popMatrix();
sawine@5
   290
sawine@5
   291
    if (this.next) this.next.draw(scene);
sawine@5
   292
}
sawine@8
   293
Renderer.prototype.pushMatrix = function(matrix)
sawine@7
   294
{
sawine@7
   295
    var copy = mat4.create();
sawine@7
   296
    mat4.set(matrix, copy);
sawine@7
   297
    this.matrixStack.push(copy);
sawine@7
   298
}
sawine@8
   299
Renderer.prototype.popMatrix = function()    
sawine@7
   300
{
sawine@7
   301
    if (this.matrixStack.length > 0) return this.matrixStack.pop();
sawine@7
   302
}
sawine@5
   303
sawine@5
   304
function Machine(scene)
sawine@4
   305
{
sawine@5
   306
    this.scene = scene;
sawine@8
   307
    this.lastUpdate = 0;
sawine@5
   308
}
sawine@8
   309
Machine.prototype.update = function(time)
sawine@5
   310
{
sawine@8
   311
    if (this.lastUpdate != 0)
sawine@8
   312
    {
sawine@9
   313
	var diff = time - this.lastUpdate;
sawine@8
   314
	
sawine@8
   315
    }
sawine@8
   316
    this.lastUpdate = time;
sawine@4
   317
}
sawine@4
   318
sawine@2
   319
function Context(canvas)
sawine@2
   320
{
sawine@3
   321
    this.canvas = canvas;
sawine@2
   322
    try 
sawine@2
   323
    {
sawine@2
   324
	this.gl = canvas.getContext("experimental-webgl");
sawine@2
   325
	this.viewport = {'width': canvas.width,
sawine@2
   326
			 'height': canvas.height};
sawine@2
   327
    } 
sawine@2
   328
    catch(e) 
sawine@2
   329
    {
sawine@2
   330
	alert(e);
sawine@2
   331
    }
sawine@2
   332
    if (!this.gl) alert("Failed: WebGL init.");
sawine@2
   333
    this.mvMatrix = mat4.create();
sawine@2
   334
    this.pMatrix = mat4.create();
sawine@10
   335
    this.shader = new Shader(this);  
sawine@2
   336
}
sawine@2
   337
Context.prototype.updateMatrixUniforms = function()
sawine@2
   338
{
sawine@2
   339
    var gl = this.gl;
sawine@2
   340
    var program = this.shader;
sawine@2
   341
    var pMatrix = this.pMatrix;
sawine@2
   342
    var mvMatrix = this.mvMatrix;
sawine@2
   343
    gl.uniformMatrix4fv(program.pMatrixUniform, false, pMatrix);
sawine@2
   344
    gl.uniformMatrix4fv(program.mvMatrixUniform, false, mvMatrix);
sawine@2
   345
}
sawine@10
   346
Context.prototype.expand = function()
sawine@10
   347
{ 
sawine@10
   348
    var width = window.innerWidth;
sawine@10
   349
    var height = window.innerHeight;
sawine@10
   350
    this.canvas.width = width;
sawine@10
   351
    this.canvas.height = height;
sawine@10
   352
    this.viewport.width = width;
sawine@10
   353
    this.viewport.height = height;
sawine@10
   354
}
sawine@10
   355
sawine@2
   356
function Shader(context)
sawine@2
   357
{
sawine@2
   358
    var gl = context.gl;
sawine@9
   359
    var fragment = loadShader(gl, "fragment-shader");
sawine@9
   360
    var vertex = loadShader(gl, "vertex-shader");
sawine@2
   361
    this.program = gl.createProgram();
sawine@2
   362
    gl.attachShader(this.program, vertex);
sawine@2
   363
    gl.attachShader(this.program, fragment);
sawine@2
   364
    gl.linkProgram(this.program);
sawine@2
   365
sawine@2
   366
    if (!gl.getProgramParameter(this.program, gl.LINK_STATUS))
sawine@2
   367
    {
sawine@2
   368
	alert("Failed: Shader init.");
sawine@2
   369
    }
sawine@2
   370
sawine@2
   371
    gl.useProgram(this.program);
sawine@2
   372
    this.vertexPosition = gl.getAttribLocation(this.program, "aVertexPosition");
sawine@2
   373
    gl.enableVertexAttribArray(this.vertexPosition);
sawine@4
   374
    
sawine@4
   375
    this.vertexColour = gl.getAttribLocation(this.program, "aVertexColour");
sawine@4
   376
    gl.enableVertexAttribArray(this.vertexColour);
sawine@4
   377
sawine@2
   378
    this.pMatrixUniform = gl.getUniformLocation(this.program, "uPMatrix");
sawine@2
   379
    this.mvMatrixUniform = gl.getUniformLocation(this.program, "uMVMatrix");
sawine@2
   380
sawine@9
   381
    function loadShader(gl, id)
sawine@2
   382
    {
sawine@2
   383
	var script = document.getElementById(id);
sawine@2
   384
	if (!script) return null;
sawine@2
   385
	
sawine@2
   386
	var str = "";
sawine@2
   387
	var child = script.firstChild;
sawine@2
   388
	while (child)
sawine@2
   389
	{
sawine@2
   390
	    if (child.nodeType == 3) str += child.textContent;
sawine@2
   391
	    child = child.nextSibling;
sawine@2
   392
	}
sawine@2
   393
	
sawine@2
   394
	var shader;
sawine@2
   395
	var common = "x-shader/x-";
sawine@2
   396
	if (script.type == common + "fragment") shader = gl.createShader(gl.FRAGMENT_SHADER);
sawine@2
   397
	else if (script.type == common + "vertex") shader = gl.createShader(gl.VERTEX_SHADER);
sawine@2
   398
	else return null;
sawine@2
   399
sawine@2
   400
	gl.shaderSource(shader, str);
sawine@2
   401
	gl.compileShader(shader);
sawine@2
   402
sawine@2
   403
	if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS))
sawine@2
   404
        {
sawine@2
   405
	    alert(gl.getShaderInfoLog(shader));
sawine@2
   406
	    return null;
sawine@2
   407
	}
sawine@2
   408
sawine@2
   409
	return shader;
sawine@2
   410
    }
sawine@2
   411
}
sawine@2
   412
sawine@2
   413
sawine@7
   414
function Cube(size, context)
sawine@2
   415
{
sawine@2
   416
    var gl = context.gl;
sawine@2
   417
    this.size = size || 1;
sawine@10
   418
    this.rotation = {'x': 0.0, 'y': 0.0, 'z': 0.0};
sawine@4
   419
    
sawine@4
   420
    this.positionBuffer = gl.createBuffer();
sawine@4
   421
    gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);
sawine@9
   422
    var vertices = [
sawine@9
   423
	     // Front face
sawine@9
   424
            -1.0, -1.0,  1.0,
sawine@9
   425
             1.0, -1.0,  1.0,
sawine@9
   426
             1.0,  1.0,  1.0,
sawine@9
   427
            -1.0,  1.0,  1.0,
sawine@9
   428
 
sawine@9
   429
            // Back face
sawine@9
   430
            -1.0, -1.0, -1.0,
sawine@9
   431
            -1.0,  1.0, -1.0,
sawine@9
   432
             1.0,  1.0, -1.0,
sawine@9
   433
             1.0, -1.0, -1.0,
sawine@9
   434
 
sawine@9
   435
            // Top face
sawine@9
   436
            -1.0,  1.0, -1.0,
sawine@9
   437
            -1.0,  1.0,  1.0,
sawine@9
   438
             1.0,  1.0,  1.0,
sawine@9
   439
             1.0,  1.0, -1.0,
sawine@9
   440
 
sawine@9
   441
            // Bottom face
sawine@9
   442
            -1.0, -1.0, -1.0,
sawine@9
   443
             1.0, -1.0, -1.0,
sawine@9
   444
             1.0, -1.0,  1.0,
sawine@9
   445
            -1.0, -1.0,  1.0,
sawine@9
   446
 
sawine@9
   447
            // Right face
sawine@9
   448
             1.0, -1.0, -1.0,
sawine@9
   449
             1.0,  1.0, -1.0,
sawine@9
   450
             1.0,  1.0,  1.0,
sawine@9
   451
             1.0, -1.0,  1.0,
sawine@9
   452
 
sawine@9
   453
            // Left face
sawine@9
   454
            -1.0, -1.0, -1.0,
sawine@9
   455
            -1.0, -1.0,  1.0,
sawine@9
   456
            -1.0,  1.0,  1.0,
sawine@9
   457
            -1.0,  1.0, -1.0];
sawine@2
   458
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
sawine@4
   459
    this.positionBuffer.itemSize = 3;
sawine@9
   460
    this.positionBuffer.numItems = 24;
sawine@4
   461
sawine@4
   462
    this.colourBuffer = gl.createBuffer();
sawine@4
   463
    gl.bindBuffer(gl.ARRAY_BUFFER, this.colourBuffer);
sawine@9
   464
    var alpha = 1.0;
sawine@9
   465
    var colours = [[1.0, 0.0, 0.0, alpha],
sawine@9
   466
		   [0.0, 1.0, 0.0, alpha],
sawine@9
   467
		   [0.0, 0.0, 1.0, alpha],
sawine@9
   468
		   [1.0, 0.0, 1.0, alpha],
sawine@9
   469
		   [1.0, 1.0, 0.0, alpha],
sawine@9
   470
		   [0.0, 1.0, 1.0, alpha]];
sawine@9
   471
    var unpackedColours = [];
sawine@9
   472
    for (var i in colours)
sawine@4
   473
    {
sawine@9
   474
	var colour = colours[i];
sawine@9
   475
	for (var j = 0; j < 4; j++)
sawine@9
   476
	{
sawine@9
   477
	    unpackedColours = unpackedColours.concat(colour);
sawine@9
   478
	}
sawine@9
   479
	//colours = colours.concat([0.5, 0.5, 1.0, 1.0]);
sawine@4
   480
    }
sawine@9
   481
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(unpackedColours), gl.STATIC_DRAW);
sawine@4
   482
    this.colourBuffer.itemSize = 4;
sawine@9
   483
    this.colourBuffer.numItems = 24;
sawine@9
   484
sawine@9
   485
    this.indexBuffer = gl.createBuffer();
sawine@9
   486
    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);
sawine@9
   487
    var indices = [0, 1, 2, 0, 2, 3,
sawine@9
   488
		   4, 5, 6, 4, 6, 7,
sawine@9
   489
		   8, 9, 10, 8, 10, 11,
sawine@9
   490
		   12, 13, 14, 12, 14, 15,
sawine@9
   491
		   16, 17, 18, 16, 18, 19,
sawine@9
   492
		   20, 21, 22, 20, 22, 23];
sawine@9
   493
    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
sawine@9
   494
    this.indexBuffer.itemSize = 1;
sawine@9
   495
    this.indexBuffer.numItems = 36;
sawine@13
   496
}
sawine@13
   497
sawine@13
   498
function read(file, handler)
sawine@13
   499
{
sawine@13
   500
    var request = new XMLHttpRequest();
sawine@13
   501
    request.open("GET", file);
sawine@13
   502
    request.onreadystatechange = function() {
sawine@13
   503
	alert(request.readyState);
sawine@13
   504
	if (request.readyState == 4) {
sawine@13
   505
	    handler(request.responseText);
sawine@13
   506
	}
sawine@13
   507
    }
sawine@13
   508
    request.send();
sawine@13
   509
}		
sawine@13
   510
sawine@13
   511
// event handler
sawine@13
   512
function expandContext()
sawine@13
   513
{
sawine@13
   514
    renderer.context.expand();
sawine@13
   515
}
sawine@13
   516
sawine@13
   517
function moveCameraLeft()
sawine@13
   518
{
sawine@13
   519
    camera.moveLeft();
sawine@13
   520
}
sawine@13
   521
sawine@13
   522
function moveCameraRight()
sawine@13
   523
{
sawine@13
   524
    camera.moveRight();
sawine@13
   525
}
sawine@13
   526
sawine@13
   527
function moveCameraUp()
sawine@13
   528
{
sawine@13
   529
    camera.moveUp();
sawine@13
   530
}
sawine@13
   531
sawine@13
   532
function moveCameraDown()
sawine@13
   533
{
sawine@13
   534
    camera.moveDown();
sawine@13
   535
}
sawine@13
   536
sawine@14
   537
function zoomCamera(delta)
sawine@14
   538
{
sawine@14
   539
    camera.zoom(delta);
sawine@14
   540
}
sawine@14
   541
sawine@13
   542
function pitchCamera(delta)
sawine@13
   543
{
sawine@13
   544
    camera.changePitch(delta);
sawine@13
   545
}
sawine@13
   546
sawine@13
   547
function yawCamera(delta)
sawine@13
   548
{
sawine@13
   549
    camera.changeYaw(delta);
sawine@13
   550
}
sawine@13
   551
sawine@13
   552
function handleKeyDown(event)
sawine@13
   553
{
sawine@13
   554
    controller.keyboard.keyDown(event);
sawine@13
   555
}
sawine@13
   556
sawine@13
   557
function handleKeyUp(event)
sawine@13
   558
{
sawine@13
   559
    controller.keyboard.keyUp(event);
sawine@13
   560
}
sawine@13
   561
sawine@13
   562
function handleMouseDown(event)
sawine@13
   563
{
sawine@13
   564
    controller.mouse.buttonDown(event);
sawine@13
   565
}
sawine@13
   566
sawine@13
   567
function handleMouseUp(event)
sawine@13
   568
{
sawine@13
   569
    controller.mouse.buttonUp(event);
sawine@13
   570
}
sawine@13
   571
sawine@13
   572
function handleMouseMove(event)
sawine@13
   573
{
sawine@13
   574
    controller.mouse.move(event);
sawine@13
   575
}
sawine@14
   576
sawine@14
   577
function handleMouseWheel(event)
sawine@14
   578
{
sawine@14
   579
    controller.mouse.moveWheel(event);
sawine@14
   580
}