GameLib.D3.Entity = function( meshId, componentIds, position, quaternion, scale ) { this.meshId = meshId; if (typeof componentIds == 'undefined') { componentIds = []; } this.componentIds = componentIds; // constructed at runtime this.parentScene = null; this.mesh = null; if(GameLib.D3.Utils.UndefinedOrNull(position)) { position = new GameLib.D3.Vector3(0, 0, 0); } this.position = position; if(GameLib.D3.Utils.UndefinedOrNull(quaternion)) { quaternion = new GameLib.D3.Vector4(0, 0, 0, 1); } this.quaternion = quaternion; if(GameLib.D3.Utils.UndefinedOrNull(scale)) { scale = new GameLib.D3.Vector3(1, 1, 1); } this.scale = scale; }; /** * Updates the Entity and it's components * @param deltaTime Number */ GameLib.D3.Entity.prototype.update = function( deltaTime ) { for(var c in this.componentIds) { var componentId = this.componentIds[c]; var component = this.parentScene.componentIdToComponent[componentId]; if(component && component.onUpdate) { component.onUpdate(deltaTime, this); } } if(this.mesh) { this.mesh.position.set(this.position.x, this.position.y, this.position.z); this.mesh.quaternion.set(this.quaternion.x, this.quaternion.y, this.quaternion.z, this.quaternion.w); this.mesh.scale.set(this.scale.x, this.scale.y, this.scale.z); } this.onUpdate(deltaTime); }; /** * Late updates the Entity and it's components * @param deltaTime Number */ GameLib.D3.Entity.prototype.lateUpdate = function( deltaTime ) { for(var c in this.componentIds) { var componentId = this.componentIds[c]; var component = this.parentScene.componentIdToComponent[componentId]; if(component && component.onLateUpdate) { component.onLateUpdate(deltaTime, this); } } this.onLateUpdate(deltaTime); }; /** * Gets called when the entity was registered with it's parent scene * @param parentScene GameLib.D3.Scene */ GameLib.D3.Entity.prototype.register = function( parentScene ) { this.parentScene = parentScene; if(this.meshId != null && parentScene.meshIdToMesh[this.meshId]) { parentScene.instance.add(parentScene.meshIdToMesh[this.meshId]); this.mesh = parentScene.meshIdToMesh[this.meshId]; } this.onRegistered(parentScene); }; /** * Add an already registered component to the entity * @param componentId Number */ GameLib.D3.Entity.prototype.addComponentId = function( componentId ) { this.componentIds.push(componentId); }; /** * Adds a components to the entity and registers it with the entity's parent scene * @param component GameLib.D3.ComponentInterface */ GameLib.D3.Entity.prototype.addComponent = function( component ) { this.parentScene.registerComponent(component); this.componentIds.push(component.componentId); if(component.setParentEntity && typeof component.setParentEntity == 'function') { component.setParentEntity(this.parentScene, this); } }; GameLib.D3.Entity.prototype.getComponent = function( componentType ) { for(var c in this.componentIds) { var componentId = this.componentIds[c]; var component = this.parentScene.componentIdToComponent[componentId]; if (component instanceof componentType) { return component; } } return null; }; ///////////////////////// Methods to override ////////////////////////// GameLib.D3.Entity.prototype.onUpdate = function( deltaTime ) { }; GameLib.D3.Entity.prototype.onLateUpdate = function( deltaTime ) { }; GameLib.D3.Entity.prototype.onRegistered = function( parentScene ) { };