/** * System takes care of updating all the entities (based on their component data) * @param apiSystem GameLib.API.System * @constructor */ GameLib.System.Input = function( apiSystem ) { GameLib.System.call( this, apiSystem ); }; GameLib.System.Input.prototype = Object.create(GameLib.System.prototype); GameLib.System.Input.prototype.constructor = GameLib.System.Input; GameLib.System.Input.prototype.start = function() { /** * Hookup all editor input capabilities */ var entities = GameLib.EntityManager.Instance.query([GameLib.D3.Input.Editor]); entities.map(function(entity){ var component = entity.getFirstComponent(GameLib.D3.Input.Editor); component.mouseDown = component.onMouseDown(entity, GameLib.EntityManager.Instance).bind(component); component.mouseMove = component.onMouseMove(entity).bind(component); component.keyDown = component.onKeyDown(entity, GameLib.EntityManager.Instance).bind(component); component.keyUp = component.onKeyUp(entity, GameLib.EntityManager.Instance).bind(component); component.domElement.instance.addEventListener('mousedown', component.mouseDown, false); component.domElement.instance.addEventListener('mousemove', component.mouseMove, false); component.domElement.instance.addEventListener('keydown', component.keyDown, false); component.domElement.instance.addEventListener('keyup', component.keyUp, false); component.controls = new THREE.EditorControls( component.camera.instance, component.domElement.instance ); /** * After our mouse 'up' editor controls would have updated our camera * instance, so we need to update our game-lib camera to reflect these * changes - we override */ component.mouseUp = function(center) { return function() { var camera = entity.getFirstComponent(GameLib.D3.Camera); camera.position.x = camera.instance.position.x; camera.position.y = camera.instance.position.y; camera.position.z = camera.instance.position.z; camera.quaternion.x = camera.instance.quaternion.x; camera.quaternion.y = camera.instance.quaternion.y; camera.quaternion.z = camera.instance.quaternion.z; camera.quaternion.w = camera.instance.quaternion.w; camera.lookAt.x = center.x; camera.lookAt.y = center.y; camera.lookAt.z = center.z; camera.lookAt.instance.copy(center); }; }(component.controls.center).bind(component); /** * Same applies to our mouse 'scroll' event */ component.mouseWheel = function() { return function() { var camera = entity.getFirstComponent(GameLib.D3.Camera); camera.position.x = camera.instance.position.x; camera.position.y = camera.instance.position.y; camera.position.z = camera.instance.position.z; }; }.bind(component); component.domElement.instance.addEventListener('mousewheel', component.mouseWheel, false); component.domElement.instance.addEventListener('mouseup', component.mouseUp, false); }.bind(this)) }; GameLib.System.Input.prototype.stop = function() { /** * Now remove all editor input capabilities */ var entities = GameLib.EntityManager.Instance.query([GameLib.D3.Input.Editor]); entities.map(function(entity){ var component = entity.getFirstComponent(GameLib.D3.Input.Editor); component.domElement.instance.removeEventListener('mousedown', component.mouseDown, false); component.domElement.instance.removeEventListener('mousemove', component.mouseMove, false); component.domElement.instance.removeEventListener('keydown', component.keyDown, false); component.domElement.instance.removeEventListener('keyup', component.keyUp, false); component.controls.dispose(); component.domElement.instance.removeEventListener('mouseup', component.mouseUp, false); component.domElement.instance.removeEventListener('mousewheel', component.mouseWheel, false); }); };