sawine@2: var machine; sawine@8: var renderer; sawine@11: var controller; sawine@11: var camera; sawine@19: var cameraSpeed = {"h": 0.1, "v": 0.1, "zoom": 0.5, "pitch": 0.5, "yaw": 0.5}; sawine@13: var keyActionMap = {'A': moveCameraLeft, sawine@13: 'D': moveCameraRight, sawine@13: 'W': moveCameraUp, sawine@13: 'S': moveCameraDown}; sawine@14: var mouseActionMap = {"pitch": [[true, false, false], pitchCamera], sawine@14: "yaw": [[true, false, false], yawCamera], sawine@14: "wheel": zoomCamera}; sawine@24: include("scripts/cube.js"); sawine@24: include("scripts/renderer.js"); sawine@2: sawine@2: function main() sawine@2: { sawine@2: var canvas = document.getElementById("machine"); sawine@2: var context = new Context(canvas); sawine@10: context.expand(); sawine@2: var gl = context.gl; sawine@7: var object = new Cube(1, context); sawine@2: gl.clearColor(0.0, 0.0, 0.0, 1.0); sawine@2: gl.enable(gl.DEPTH_TEST); sawine@11: machine = new Machine(object); sawine@22: camera = new Camera(cameraSpeed, [0, 5, 20]); sawine@11: renderer = new Renderer(camera, context); sawine@13: controller = new Controller(keyActionMap, mouseActionMap, camera, machine, renderer); sawine@6: update(); sawine@13: window.onresize = expandContext; sawine@13: document.onkeydown = handleKeyDown; sawine@13: document.onkeyup = handleKeyUp; sawine@13: canvas.onmousedown = handleMouseDown; sawine@13: document.onmouseup = handleMouseUp; sawine@13: document.onmousemove = handleMouseMove; sawine@14: document.onmousewheel = handleMouseWheel; sawine@13: //read("config/camera", configureCamera); sawine@13: } sawine@13: sawine@13: function configureCamera(config) { sawine@13: alert(config); sawine@6: } sawine@6: sawine@6: function update() sawine@6: { sawine@7: requestAnimFrame(update); sawine@11: controller.update(); sawine@10: machine.scene.rotation.x += (random(0, 2) - 2) * 0.001; sawine@10: machine.scene.rotation.y += (random(0, 3) - 1) * 0.001; sawine@10: machine.scene.rotation.z += (random(0, 2) - 1) * 0.001; sawine@8: machine.update(new Date().getTime()); sawine@8: renderer.update(machine.scene); sawine@2: } sawine@2: sawine@9: function random(min, max) sawine@9: { sawine@10: return (min + Math.random() * (max - min)); sawine@9: } sawine@9: sawine@22: function normalize(vectors) sawine@22: { sawine@22: for (var v in vectors) vec3.normalize(v); sawine@22: } sawine@22: sawine@22: function Camera(speed, pos, up, right, target) sawine@4: { sawine@12: this.speed = speed; sawine@22: this.pos = vec3.create(pos || [0, 0, 7]); sawine@22: this.up = vec3.create(up || [0, 1, 0]); sawine@22: this.right = vec3.create(right || [1, 0, 0]); sawine@22: this.target = vec3.create(target || [0, 0, -1]); sawine@22: normalize([this.up, this.right, this.target]); sawine@16: this.matrix = mat4.create(); sawine@11: } sawine@11: Camera.prototype.moveLeft = function() sawine@11: { sawine@19: var dir = vec3.create(this.right); sawine@19: vec3.scale(dir, -this.speed.h); sawine@19: vec3.add(this.pos, dir); sawine@11: } sawine@11: Camera.prototype.moveRight = function() sawine@11: { sawine@19: var dir = vec3.create(this.right); sawine@19: vec3.scale(dir, this.speed.h); sawine@19: vec3.add(this.pos, dir); sawine@11: } sawine@11: Camera.prototype.moveUp = function() sawine@19: { sawine@19: var dir = vec3.create(this.up); sawine@19: vec3.scale(dir, this.speed.v); sawine@19: vec3.add(this.pos, dir); sawine@11: } sawine@11: Camera.prototype.moveDown = function() sawine@19: { sawine@19: var dir = vec3.create(this.up); sawine@19: vec3.scale(dir, -this.speed.v); sawine@19: vec3.add(this.pos, dir); sawine@13: } sawine@14: Camera.prototype.zoom = function(delta) sawine@13: { sawine@19: var dir = vec3.create(this.target); sawine@20: vec3.scale(dir, delta * this.speed.zoom); sawine@19: vec3.add(this.pos, dir); sawine@13: } sawine@19: Camera.prototype.pitch = function(delta) sawine@13: { sawine@21: delta *= -this.speed.pitch; sawine@21: vec3.scale(this.target, Math.cos(delta)); sawine@21: vec3.scale(this.up, Math.sin(delta)); sawine@21: vec3.add(this.target, this.up); sawine@21: vec3.normalize(this.target); sawine@21: vec3.cross(this.target, this.right, this.up); sawine@21: vec3.scale(this.up, -1); sawine@13: } sawine@19: Camera.prototype.yaw = function(delta) sawine@13: { sawine@21: delta *= -this.speed.yaw; sawine@21: vec3.scale(this.right, Math.cos(delta)); sawine@21: vec3.scale(this.target, Math.sin(delta)); sawine@21: vec3.add(this.right, this.target); sawine@21: vec3.normalize(this.right); sawine@21: vec3.cross(this.right, this.up, this.target); sawine@21: vec3.scale(this.target, -1); sawine@19: } sawine@19: Camera.prototype.roll = function(delta) sawine@19: { sawine@19: sawine@12: } sawine@15: Camera.prototype.update = function() sawine@15: { sawine@19: var x = vec3.dot(this.right, this.pos); sawine@19: var y = vec3.dot(this.up, this.pos); sawine@19: var z = vec3.dot(this.target, this.pos); sawine@19: this.matrix = mat4.create([this.right[0], this.up[0], -this.target[0], 0, sawine@19: this.right[1], this.up[1], -this.target[1], 0, sawine@19: this.right[2], this.up[2], -this.target[2], 0, sawine@22: -x, -y, z, 1]); sawine@15: } sawine@12: sawine@13: function Controller(keyActionMap, mouseActionMap, camera, machine, renderer) sawine@11: { sawine@13: this.keyboard = new Keyboard(keyActionMap); sawine@13: this.mouse = new Mouse(mouseActionMap); sawine@11: sawine@11: } sawine@11: Controller.prototype.update = function() sawine@11: { sawine@11: this.keyboard.handle(); sawine@13: this.mouse.handle(); sawine@11: } sawine@11: sawine@13: function Mouse(actionMap) sawine@11: { sawine@13: this.actionMap = actionMap; sawine@14: this.pressed = [false, false, false]; sawine@14: this.wheelDelta = 0; sawine@11: } sawine@13: Mouse.prototype.buttonDown = function(event) sawine@13: { sawine@13: this.pressed[event.which-1] = true; sawine@13: } sawine@13: Mouse.prototype.buttonUp = function(event) sawine@13: { sawine@13: this.pressed[event.which-1] = false; sawine@13: } sawine@13: Mouse.prototype.move = function(event) sawine@13: { sawine@14: this.currentPos = [event.clientX, event.clientY]; sawine@14: } sawine@14: Mouse.prototype.moveWheel = function(event) sawine@14: { sawine@14: this.wheelDelta += event.wheelDelta; sawine@14: } sawine@14: Mouse.prototype.handle = function() sawine@14: { sawine@14: var pos = this.currentPos; sawine@14: if (pos && this.lastPos) sawine@13: { sawine@13: var delta = [pos[0] - this.lastPos[0], pos[1] - this.lastPos[1]]; sawine@14: delta = normaliseMoveDelta(delta); sawine@13: var action = this.actionMap["pitch"]; sawine@13: if (delta[1] != 0 && action) sawine@13: { sawine@13: for (var i = 0; i < 3; i++) sawine@13: { sawine@13: if (this.pressed[i] != action[0][i]) break; sawine@13: if (i == 2) action[1](delta[1]); sawine@13: } sawine@13: } sawine@13: action = this.actionMap["yaw"]; sawine@13: if (delta[0] != 0 && action) sawine@13: { sawine@13: for (var i = 0; i < 3; i++) sawine@13: { sawine@13: if (this.pressed[i] != action[0][i]) break; sawine@13: if (i == 2) action[1](delta[0]); sawine@13: } sawine@13: } sawine@13: } sawine@13: this.lastPos = pos; sawine@14: sawine@14: if (this.wheelDelta != 0) sawine@14: { sawine@14: var delta = normaliseWheelDelta(this.wheelDelta); sawine@14: var action = this.actionMap["wheel"]; sawine@21: if (delta != 0 && action) action(delta); sawine@14: this.wheelDelta = 0; sawine@14: } sawine@14: sawine@13: } sawine@13: sawine@14: function normaliseMoveDelta(delta) sawine@13: { sawine@13: var width = renderer.context.canvas.width; sawine@13: var height = renderer.context.canvas.height; sawine@13: return [delta[0] / width, delta[1] / height]; sawine@13: } sawine@13: sawine@14: function normaliseWheelDelta(delta) sawine@14: { sawine@14: return delta / 60; sawine@14: } sawine@14: sawine@11: function Keyboard(actionMap) sawine@11: { sawine@11: this.actionMap = actionMap; sawine@11: this.pressed = {}; sawine@11: } sawine@11: Keyboard.prototype.keyDown = function(event) sawine@11: { sawine@11: this.pressed[event.keyCode] = true; sawine@11: } sawine@11: Keyboard.prototype.keyUp = function(event) sawine@11: { sawine@11: this.pressed[event.keyCode] = false; sawine@11: } sawine@11: Keyboard.prototype.handle = function() sawine@11: { sawine@11: for (key in this.pressed) sawine@11: { sawine@11: if (this.pressed[key]) sawine@11: { sawine@11: key = String.fromCharCode(key); sawine@11: if (this.actionMap[key]) this.actionMap[key](); sawine@11: } sawine@11: } sawine@11: } sawine@11: sawine@5: sawine@5: sawine@5: function Machine(scene) sawine@4: { sawine@5: this.scene = scene; sawine@8: this.lastUpdate = 0; sawine@5: } sawine@8: Machine.prototype.update = function(time) sawine@5: { sawine@8: if (this.lastUpdate != 0) sawine@8: { sawine@9: var diff = time - this.lastUpdate; sawine@8: sawine@8: } sawine@8: this.lastUpdate = time; sawine@4: } sawine@4: sawine@10: sawine@2: sawine@2: sawine@4: sawine@13: sawine@13: function read(file, handler) sawine@13: { sawine@13: var request = new XMLHttpRequest(); sawine@13: request.open("GET", file); sawine@13: request.onreadystatechange = function() { sawine@13: alert(request.readyState); sawine@13: if (request.readyState == 4) { sawine@13: handler(request.responseText); sawine@13: } sawine@13: } sawine@13: request.send(); sawine@13: } sawine@13: sawine@13: // event handler sawine@13: function expandContext() sawine@13: { sawine@13: renderer.context.expand(); sawine@13: } sawine@13: sawine@13: function moveCameraLeft() sawine@13: { sawine@13: camera.moveLeft(); sawine@13: } sawine@13: sawine@13: function moveCameraRight() sawine@13: { sawine@13: camera.moveRight(); sawine@13: } sawine@13: sawine@13: function moveCameraUp() sawine@13: { sawine@13: camera.moveUp(); sawine@13: } sawine@13: sawine@13: function moveCameraDown() sawine@13: { sawine@13: camera.moveDown(); sawine@13: } sawine@13: sawine@14: function zoomCamera(delta) sawine@14: { sawine@14: camera.zoom(delta); sawine@14: } sawine@14: sawine@13: function pitchCamera(delta) sawine@13: { sawine@19: camera.pitch(delta); sawine@13: } sawine@13: sawine@13: function yawCamera(delta) sawine@13: { sawine@19: camera.yaw(delta); sawine@13: } sawine@13: sawine@13: function handleKeyDown(event) sawine@13: { sawine@13: controller.keyboard.keyDown(event); sawine@13: } sawine@13: sawine@13: function handleKeyUp(event) sawine@13: { sawine@13: controller.keyboard.keyUp(event); sawine@13: } sawine@13: sawine@13: function handleMouseDown(event) sawine@13: { sawine@13: controller.mouse.buttonDown(event); sawine@13: } sawine@13: sawine@13: function handleMouseUp(event) sawine@13: { sawine@13: controller.mouse.buttonUp(event); sawine@13: } sawine@13: sawine@13: function handleMouseMove(event) sawine@13: { sawine@13: controller.mouse.move(event); sawine@13: } sawine@14: sawine@14: function handleMouseWheel(event) sawine@14: { sawine@14: controller.mouse.moveWheel(event); sawine@14: }