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