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