From fafc068fad1acbb745f1263340d0105f4c56254c Mon Sep 17 00:00:00 2001 From: polygonboutique Date: Tue, 29 Nov 2016 15:26:54 +0100 Subject: [PATCH] parent entity link component: center to origin fixed --- src/game-lib-component-entity-parent.js | 49 ++++++++++++++++++------- src/game-lib-entity.js | 9 ++++- 2 files changed, 44 insertions(+), 14 deletions(-) diff --git a/src/game-lib-component-entity-parent.js b/src/game-lib-component-entity-parent.js index 1c40c5f..b5a66b6 100644 --- a/src/game-lib-component-entity-parent.js +++ b/src/game-lib-component-entity-parent.js @@ -36,23 +36,46 @@ GameLib.D3.ComponentEntityParent.prototype.onLateUpdate = function( if(parentEntity && this.parent) { if(this.centerToOrigin) { - parentEntity.position.x = this.parent.position.x + this.parent.origin.x - this.originPosition.x; - parentEntity.position.y = this.parent.position.y + this.parent.origin.y - this.originPosition.y; - parentEntity.position.z = this.parent.position.z + this.parent.origin.z - this.originPosition.z; + this.parentEntity.position.x = this.parent.position.x + ((this.parent.origin.x - this.originPosition.x) * this.parent.scale.x); + this.parentEntity.position.y = this.parent.position.y + ((this.parent.origin.y - this.originPosition.y) * this.parent.scale.y); + this.parentEntity.position.z = this.parent.position.z + ((this.parent.origin.z - this.originPosition.z) * this.parent.scale.z); + + // apply quaternion + // + + var tmpVector = new THREE.Vector3( + parentEntity.position.x, + parentEntity.position.y, + parentEntity.position.z + ).applyQuaternion( + new THREE.Quaternion( + this.parent.quaternion.x, + this.parent.quaternion.y, + this.parent.quaternion.z, + this.parent.quaternion.w + ) + ); + + this.parentEntity.position.x = tmpVector.x; + this.parentEntity.position.y = tmpVector.y; + this.parentEntity.position.z = tmpVector.z; + } else { - parentEntity.position.x = this.parent.position.x; - parentEntity.position.y = this.parent.position.y; - parentEntity.position.z = this.parent.position.z; + this.parentEntity.position.x = this.parent.position.x; + this.parentEntity.position.y = this.parent.position.y; + this.parentEntity.position.z = this.parent.position.z; } - parentEntity.quaternion.x = this.parent.quaternion.x; - parentEntity.quaternion.y = this.parent.quaternion.y; - parentEntity.quaternion.z = this.parent.quaternion.z; - parentEntity.quaternion.w = this.parent.quaternion.w; + this.parentEntity.quaternion.x = this.parent.quaternion.x; + this.parentEntity.quaternion.y = this.parent.quaternion.y; + this.parentEntity.quaternion.z = this.parent.quaternion.z; + this.parentEntity.quaternion.w = this.parent.quaternion.w; - parentEntity.scale.x = this.parent.scale.x; - parentEntity.scale.y = this.parent.scale.y; - parentEntity.scale.z = this.parent.scale.z; + this.parentEntity.scale.x = this.parent.scale.x; + this.parentEntity.scale.y = this.parent.scale.y; + this.parentEntity.scale.z = this.parent.scale.z; + + this.parentEntity.mesh.updateMatrix(); } }; diff --git a/src/game-lib-entity.js b/src/game-lib-entity.js index 0a5c524..ebda39a 100644 --- a/src/game-lib-entity.js +++ b/src/game-lib-entity.js @@ -55,8 +55,15 @@ GameLib.D3.Entity.prototype.update = function( 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.mesh.quaternion.set(this.quaternion.x, this.quaternion.y, this.quaternion.z, this.quaternion.w).normalize(); + + // normalize the quaternion, if we have a mesh. + // if we don't do this, then the mesh will get stretched + this.quaternion.x = this.mesh.quaternion.x; + this.quaternion.y = this.mesh.quaternion.y; + this.quaternion.z = this.mesh.quaternion.z; + this.quaternion.w = this.mesh.quaternion.w; } this.onUpdate(deltaTime);