box-sphere trigger area component
parent
a3f552b941
commit
66c8e76983
|
@ -0,0 +1,89 @@
|
|||
//
|
||||
// this component operates on it's parent entity's bounding box.
|
||||
// so, you can't use this component with a null-mesh.
|
||||
//
|
||||
GameLib.D3.ComponentTriggerBoxSphere = function(
|
||||
componentId,
|
||||
entitiesToCheck,
|
||||
callback
|
||||
) {
|
||||
this.componentId = componentId || GameLib.D3.Tools.RandomId();
|
||||
this.parentEntity = null;
|
||||
|
||||
// Todo: this should be executed somewhere in game-lib-z, so that we don't execute it on every construction of an object.
|
||||
GameLib.D3.Utils.Extend(GameLib.D3.ComponentTriggerBoxSphere, GameLib.D3.ComponentInterface);
|
||||
|
||||
this.entitiesToCheck = entitiesToCheck || [];
|
||||
this.callback = callback || null;
|
||||
};
|
||||
|
||||
if(typeof THREE != "undefined") {
|
||||
ComponentTriggerBoxSphere_BoxInverseTransform = new THREE.Matrix4();
|
||||
ComponentTriggerBoxSphere_TargetPosition_Vec3 = new THREE.Vector3();
|
||||
ComponentTriggerBoxSphere_TargetRadius = 0.0;
|
||||
}
|
||||
|
||||
///////////////////////// Methods to override //////////////////////////
|
||||
GameLib.D3.ComponentTriggerBoxSphere.prototype.onUpdate = function(
|
||||
deltaTime,
|
||||
parentEntity
|
||||
) {
|
||||
|
||||
if(parentEntity.mesh) {
|
||||
// Calculate the current transform here, using the position, orientation and scale of the entity.
|
||||
|
||||
if(!parentEntity.mesh.geometry.boundingBox) {
|
||||
parentEntity.mesh.geometry.computeBoundingBox();
|
||||
}
|
||||
|
||||
ComponentTriggerBoxSphere_BoxInverseTransform.getInverse(parentEntity.mesh.matrix);
|
||||
|
||||
for(var e in this.entitiesToCheck) {
|
||||
var entityToCheck = this.entitiesToCheck[e];
|
||||
|
||||
if(entityToCheck.mesh) {
|
||||
|
||||
if (!entityToCheck.mesh.geometry.boundingSphere) {
|
||||
entityToCheck.mesh.geometry.computeBoundingSphere();
|
||||
}
|
||||
|
||||
var spherePosition = new THREE.Vector3(
|
||||
entityToCheck.position.x,
|
||||
entityToCheck.position.y,
|
||||
entityToCheck.position.z
|
||||
);
|
||||
|
||||
spherePosition.applyMatrix4(ComponentTriggerBoxSphere_BoxInverseTransform);
|
||||
|
||||
var sphere = new THREE.Sphere(
|
||||
spherePosition,
|
||||
entityToCheck.mesh.geometry.boundingSphere.radius
|
||||
);
|
||||
|
||||
if(this.callback && parentEntity.mesh.geometry.boundingBox.intersectsSphere(sphere)) {
|
||||
this.callback(parentEntity, entityToCheck);
|
||||
}
|
||||
|
||||
} else { // no target mesh geometry.
|
||||
|
||||
var spherePosition = new THREE.Vector3(
|
||||
entityToCheck.position.x,
|
||||
entityToCheck.position.y,
|
||||
entityToCheck.position.z
|
||||
);
|
||||
|
||||
spherePosition.applyMatrix4(ComponentTriggerBoxSphere_BoxInverseTransform);
|
||||
|
||||
var sphere = new THREE.Sphere(
|
||||
spherePosition,
|
||||
1
|
||||
);
|
||||
|
||||
if(this.callback && parentEntity.mesh.geometry.boundingBox.intersectsSphere(sphere)) {
|
||||
this.callback(parentEntity, entityToCheck);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
Loading…
Reference in New Issue