scripts/machine.js
author Eugen Sawin <sawine@me73.com>
Wed, 27 Apr 2011 14:14:07 +0200
changeset 30 95688249c40c
parent 29 99652d00489f
child 32 1b4c3fcff1b0
permissions -rwxr-xr-x
Added per-vertex positional lighting.
sawine@2
     1
var machine;
sawine@8
     2
var renderer;
sawine@11
     3
var controller;
sawine@11
     4
var camera;
sawine@28
     5
var cameraSpeed = {"h": 1.0, "v": 1.0, "zoom": 1.0, "pitch": 1.0, "yaw": 1.0, "roll": 1.0};
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@27
    12
		      "rotate": [[true, false, false], rotateCamera],
sawine@14
    13
                      "wheel": zoomCamera};
sawine@24
    14
include("scripts/cube.js");
sawine@24
    15
include("scripts/renderer.js");
sawine@27
    16
include("scripts/camera.js");
sawine@2
    17
sawine@2
    18
function main()
sawine@2
    19
{
sawine@2
    20
    var canvas = document.getElementById("machine");
sawine@2
    21
    var context = new Context(canvas);
sawine@10
    22
    context.expand();
sawine@2
    23
    var gl = context.gl;
sawine@28
    24
    var scene = createScene(context);   
sawine@30
    25
    gl.clearColor(0.05, 0.05, 0.05, 1.0);
sawine@2
    26
    gl.enable(gl.DEPTH_TEST);
sawine@28
    27
    machine = new Machine(scene);       
sawine@22
    28
    camera = new Camera(cameraSpeed, [0, 5, 20]);
sawine@11
    29
    renderer = new Renderer(camera, context);
sawine@13
    30
    controller = new Controller(keyActionMap, mouseActionMap, camera, machine, renderer);
sawine@6
    31
    update();
sawine@13
    32
    window.onresize = expandContext;
sawine@13
    33
    document.onkeydown = handleKeyDown;
sawine@13
    34
    document.onkeyup = handleKeyUp;
sawine@13
    35
    canvas.onmousedown = handleMouseDown;
sawine@13
    36
    document.onmouseup = handleMouseUp;
sawine@13
    37
    document.onmousemove = handleMouseMove;
sawine@14
    38
    document.onmousewheel = handleMouseWheel;
sawine@13
    39
    //read("config/camera", configureCamera);
sawine@13
    40
}
sawine@13
    41
sawine@28
    42
function createScene(context)
sawine@28
    43
{
sawine@30
    44
    var cube = new Cube(1, context);
sawine@30
    45
    var scene = new Node([0, 0, 0], [0, 0, 0], cube);
sawine@30
    46
    var dim = 10;
sawine@29
    47
    var d = 4;
sawine@28
    48
    for (var x = 0; x < dim; x += 1) {
sawine@28
    49
	for (var y = 0; y < dim; y += 1) {
sawine@28
    50
	    for (var z = 0; z < dim; z += 1) {		
sawine@28
    51
		var pos = [x * d, y * d, -z * d];
sawine@30
    52
		scene.children.push(new Node(pos, [0, 0, 0], cube));
sawine@28
    53
	    }
sawine@28
    54
	}
sawine@28
    55
    }
sawine@28
    56
    return scene;
sawine@28
    57
}
sawine@28
    58
sawine@13
    59
function configureCamera(config) {
sawine@13
    60
    alert(config);
sawine@6
    61
}
sawine@6
    62
sawine@6
    63
function update()
sawine@6
    64
{    
sawine@7
    65
    requestAnimFrame(update);
sawine@11
    66
    controller.update();
sawine@28
    67
    //machine.scene.rotation.x += (random(0, 2) - 2) * 0.001; 
sawine@28
    68
    // machine.scene.rotation.y += (random(0, 3) - 1) * 0.001; 
sawine@28
    69
    // machine.scene.rotation.z += (random(0, 2) - 1) * 0.001;
sawine@8
    70
    machine.update(new Date().getTime());
sawine@28
    71
    camera.update();
sawine@8
    72
    renderer.update(machine.scene);
sawine@2
    73
}
sawine@2
    74
sawine@9
    75
function random(min, max)
sawine@9
    76
{
sawine@10
    77
    return (min + Math.random() * (max - min));
sawine@9
    78
}
sawine@9
    79
sawine@22
    80
function normalize(vectors)
sawine@22
    81
{
sawine@22
    82
    for (var v in vectors) vec3.normalize(v);
sawine@22
    83
}
sawine@22
    84
sawine@13
    85
function Controller(keyActionMap, mouseActionMap, camera, machine, renderer)
sawine@11
    86
{ 
sawine@13
    87
    this.keyboard = new Keyboard(keyActionMap);
sawine@28
    88
    this.mouse = new Mouse(mouseActionMap);   
sawine@11
    89
}
sawine@11
    90
Controller.prototype.update = function()
sawine@11
    91
{
sawine@11
    92
    this.keyboard.handle();
sawine@13
    93
    this.mouse.handle();
sawine@11
    94
}
sawine@11
    95
sawine@13
    96
function Mouse(actionMap)
sawine@11
    97
{
sawine@13
    98
    this.actionMap = actionMap;
sawine@14
    99
    this.pressed = [false, false, false];   
sawine@14
   100
    this.wheelDelta = 0;
sawine@27
   101
    this.posStack = [];
sawine@11
   102
}
sawine@13
   103
Mouse.prototype.buttonDown = function(event)
sawine@13
   104
{
sawine@13
   105
    this.pressed[event.which-1] = true;
sawine@13
   106
}
sawine@13
   107
Mouse.prototype.buttonUp = function(event)
sawine@13
   108
{
sawine@13
   109
    this.pressed[event.which-1] = false;
sawine@13
   110
}
sawine@13
   111
Mouse.prototype.move = function(event)
sawine@13
   112
{
sawine@27
   113
    this.posStack.push([event.clientX, event.clientY]);
sawine@27
   114
    //this.currentPos = [event.clientX, event.clientY];
sawine@14
   115
}
sawine@14
   116
Mouse.prototype.moveWheel = function(event)
sawine@14
   117
{ 
sawine@14
   118
    this.wheelDelta += event.wheelDelta;
sawine@14
   119
}
sawine@14
   120
Mouse.prototype.handle = function()
sawine@14
   121
{
sawine@27
   122
    while (this.posStack.length > 0)
sawine@13
   123
    {
sawine@27
   124
	var pos = this.posStack.pop();
sawine@27
   125
	if (this.lastPos)
sawine@13
   126
	{
sawine@27
   127
	    var delta = [pos[0] - this.lastPos[0], pos[1] - this.lastPos[1], 0];
sawine@27
   128
	    delta = normaliseMoveDelta(delta);
sawine@27
   129
	    var action = this.actionMap["pitch"];
sawine@27
   130
	    if (delta[1] != 0 && action) 
sawine@13
   131
	    {
sawine@27
   132
		for (var i = 0; i < 3; i++)
sawine@27
   133
		{
sawine@27
   134
		    if (this.pressed[i] != action[0][i]) break;
sawine@27
   135
		    if (i == 2) action[1](delta[1]);
sawine@27
   136
		}
sawine@27
   137
	    } 
sawine@27
   138
	    action = this.actionMap["yaw"];
sawine@27
   139
	    if (delta[0] != 0 && action) 
sawine@13
   140
	    {
sawine@27
   141
		for (var i = 0; i < 3; i++)
sawine@27
   142
		{
sawine@27
   143
		    if (this.pressed[i] != action[0][i]) break;
sawine@27
   144
		    if (i == 2) action[1](delta[0]);
sawine@27
   145
	       	}
sawine@13
   146
	    }
sawine@13
   147
	}
sawine@27
   148
	this.lastPos = pos;
sawine@27
   149
    }   
sawine@14
   150
    if (this.wheelDelta != 0)
sawine@14
   151
    {
sawine@14
   152
	var delta = normaliseWheelDelta(this.wheelDelta);
sawine@14
   153
	var action = this.actionMap["wheel"];
sawine@21
   154
	if (delta != 0 && action) action(delta);
sawine@14
   155
	this.wheelDelta = 0;
sawine@27
   156
    } 
sawine@13
   157
}
sawine@13
   158
sawine@14
   159
function normaliseMoveDelta(delta)
sawine@13
   160
{
sawine@13
   161
    var width = renderer.context.canvas.width;
sawine@13
   162
    var height = renderer.context.canvas.height;
sawine@27
   163
    return [delta[0] / width, delta[1] / height, 0];
sawine@13
   164
}
sawine@13
   165
sawine@14
   166
function normaliseWheelDelta(delta)
sawine@14
   167
{
sawine@14
   168
    return delta / 60;
sawine@14
   169
}
sawine@14
   170
sawine@11
   171
function Keyboard(actionMap)
sawine@11
   172
{
sawine@11
   173
    this.actionMap = actionMap;
sawine@11
   174
    this.pressed = {};
sawine@11
   175
}
sawine@11
   176
Keyboard.prototype.keyDown = function(event)
sawine@11
   177
{
sawine@11
   178
    this.pressed[event.keyCode] = true;    
sawine@11
   179
}
sawine@11
   180
Keyboard.prototype.keyUp = function(event)
sawine@11
   181
{
sawine@11
   182
    this.pressed[event.keyCode] = false;
sawine@11
   183
}
sawine@11
   184
Keyboard.prototype.handle = function()
sawine@11
   185
{
sawine@11
   186
    for (key in this.pressed)
sawine@11
   187
    {
sawine@11
   188
	if (this.pressed[key])
sawine@11
   189
	{
sawine@11
   190
	    key = String.fromCharCode(key);
sawine@11
   191
	    if (this.actionMap[key]) this.actionMap[key](); 
sawine@11
   192
	}
sawine@11
   193
    }
sawine@11
   194
}
sawine@11
   195
sawine@5
   196
function Machine(scene)
sawine@4
   197
{
sawine@5
   198
    this.scene = scene;
sawine@8
   199
    this.lastUpdate = 0;
sawine@5
   200
}
sawine@8
   201
Machine.prototype.update = function(time)
sawine@5
   202
{
sawine@28
   203
    this.scene.update(time);
sawine@8
   204
    if (this.lastUpdate != 0)
sawine@8
   205
    {
sawine@9
   206
	var diff = time - this.lastUpdate;
sawine@8
   207
	
sawine@8
   208
    }
sawine@8
   209
    this.lastUpdate = time;
sawine@4
   210
}
sawine@4
   211
sawine@13
   212
function read(file, handler)
sawine@13
   213
{
sawine@13
   214
    var request = new XMLHttpRequest();
sawine@13
   215
    request.open("GET", file);
sawine@13
   216
    request.onreadystatechange = function() {
sawine@13
   217
	alert(request.readyState);
sawine@13
   218
	if (request.readyState == 4) {
sawine@13
   219
	    handler(request.responseText);
sawine@13
   220
	}
sawine@13
   221
    }
sawine@13
   222
    request.send();
sawine@13
   223
}		
sawine@13
   224
sawine@13
   225
// event handler
sawine@13
   226
function expandContext()
sawine@13
   227
{
sawine@13
   228
    renderer.context.expand();
sawine@13
   229
}
sawine@13
   230
sawine@13
   231
function moveCameraLeft()
sawine@13
   232
{
sawine@13
   233
    camera.moveLeft();
sawine@13
   234
}
sawine@13
   235
sawine@13
   236
function moveCameraRight()
sawine@13
   237
{
sawine@13
   238
    camera.moveRight();
sawine@13
   239
}
sawine@13
   240
sawine@13
   241
function moveCameraUp()
sawine@13
   242
{
sawine@13
   243
    camera.moveUp();
sawine@13
   244
}
sawine@13
   245
sawine@13
   246
function moveCameraDown()
sawine@13
   247
{
sawine@13
   248
    camera.moveDown();
sawine@13
   249
}
sawine@13
   250
sawine@14
   251
function zoomCamera(delta)
sawine@14
   252
{
sawine@14
   253
    camera.zoom(delta);
sawine@14
   254
}
sawine@14
   255
sawine@13
   256
function pitchCamera(delta)
sawine@13
   257
{
sawine@19
   258
    camera.pitch(delta);
sawine@13
   259
}
sawine@13
   260
sawine@13
   261
function yawCamera(delta)
sawine@13
   262
{
sawine@19
   263
    camera.yaw(delta);
sawine@13
   264
}
sawine@13
   265
sawine@27
   266
function rotateCamera(angles)
sawine@27
   267
{
sawine@27
   268
    camera.rotate(angles);
sawine@27
   269
}
sawine@27
   270
sawine@13
   271
function handleKeyDown(event)
sawine@13
   272
{
sawine@13
   273
    controller.keyboard.keyDown(event);
sawine@13
   274
}
sawine@13
   275
sawine@13
   276
function handleKeyUp(event)
sawine@13
   277
{
sawine@13
   278
    controller.keyboard.keyUp(event);
sawine@13
   279
}
sawine@13
   280
sawine@13
   281
function handleMouseDown(event)
sawine@13
   282
{
sawine@13
   283
    controller.mouse.buttonDown(event);
sawine@13
   284
}
sawine@13
   285
sawine@13
   286
function handleMouseUp(event)
sawine@13
   287
{
sawine@13
   288
    controller.mouse.buttonUp(event);
sawine@13
   289
}
sawine@13
   290
sawine@13
   291
function handleMouseMove(event)
sawine@13
   292
{
sawine@13
   293
    controller.mouse.move(event);
sawine@13
   294
}
sawine@14
   295
sawine@14
   296
function handleMouseWheel(event)
sawine@14
   297
{
sawine@14
   298
    controller.mouse.moveWheel(event);
sawine@14
   299
}