From bcfa3b6df28a513efd621b51d9e82bff4a633db6 Mon Sep 17 00:00:00 2001 From: polygonboutique Date: Fri, 11 Nov 2016 16:25:39 +0100 Subject: [PATCH] 3d text, gui scene triggers: onenter, onleave, oninside --- src/game-lib-component-trigger-box-sphere.js | 85 ++++++++++--------- ...ame-lib-component-trigger-sphere-sphere.js | 31 ++++++- src/game-lib-game.js | 2 +- src/game-lib-scene.js | 22 +++-- 4 files changed, 89 insertions(+), 51 deletions(-) diff --git a/src/game-lib-component-trigger-box-sphere.js b/src/game-lib-component-trigger-box-sphere.js index 8ac3d7f..0a90b65 100644 --- a/src/game-lib-component-trigger-box-sphere.js +++ b/src/game-lib-component-trigger-box-sphere.js @@ -5,7 +5,9 @@ GameLib.D3.ComponentTriggerBoxSphere = function( componentId, entitiesToCheck, - callback + onInside, + onEnter, + onLeave ) { this.componentId = componentId || GameLib.D3.Tools.RandomId(); this.parentEntity = null; @@ -14,7 +16,12 @@ GameLib.D3.ComponentTriggerBoxSphere = function( GameLib.D3.Utils.Extend(GameLib.D3.ComponentTriggerBoxSphere, GameLib.D3.ComponentInterface); this.entitiesToCheck = entitiesToCheck || []; - this.callback = callback || null; + this.onInside = onInside || null; + this.onEnter = onEnter || null; + this.onLeave = onLeave || null; + + // runtime code + this.entitiesInside = []; }; if(typeof THREE != "undefined") { @@ -46,44 +53,44 @@ GameLib.D3.ComponentTriggerBoxSphere.prototype.onUpdate = function( 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); - } - } + + 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 ? entityToCheck.mesh.geometry.boundingSphere.radius : 1 + ); + + if(parentEntity.mesh.geometry.boundingBox.intersectsSphere(sphere)) { + + if(this.entitiesInside.indexOf(entityToCheck) <= -1) { // check if this is the first time the entity enters the trigger + this.entitiesInside.push(entityToCheck); + + if(this.onEnter) { + this.onEnter(parentEntity, entityToCheck); + } + } + + + if(this.onInside) { + this.onInside(parentEntity, entityToCheck); + } + + } else if(this.entitiesInside.indexOf(entityToCheck) > -1) { // entity WAS inside the trigger + this.entitiesInside.splice(this.entitiesInside.indexOf(entityToCheck), 1); + + if(this.onLeave) { + this.onLeave(parentEntity, entityToCheck); + } + } + } } }; \ No newline at end of file diff --git a/src/game-lib-component-trigger-sphere-sphere.js b/src/game-lib-component-trigger-sphere-sphere.js index f6419db..2ad9bdb 100644 --- a/src/game-lib-component-trigger-sphere-sphere.js +++ b/src/game-lib-component-trigger-sphere-sphere.js @@ -5,7 +5,9 @@ GameLib.D3.ComponentTriggerSphereSphere = function( componentId, sphereRadius, entitiesToCheck, - callback + onInside, + onEnter, + onLeave ) { this.componentId = componentId || GameLib.D3.Tools.RandomId(); this.parentEntity = null; @@ -15,7 +17,12 @@ GameLib.D3.ComponentTriggerSphereSphere = function( this.entitiesToCheck = entitiesToCheck || []; this.sphereRadius = sphereRadius || 1.0; - this.callback = callback || null; + this.onInside = onInside || null; + this.onEnter = onEnter || null; + this.onLeave = onLeave || null; + + // runtime code + this.entitiesInside = []; }; if(typeof THREE != "undefined") { @@ -63,8 +70,24 @@ GameLib.D3.ComponentTriggerSphereSphere.prototype.onUpdate = function( var length = ComponentTriggerSphereSphere_sphereToSphere_Vector3.length(); if((length - (ComponentTriggerSphereSphere_targetBoundingSphereRadius + this.sphereRadius)) < 0) { - if(this.callback) { - this.callback(parentEntity, entityToCheck); + + if(this.entitiesInside.indexOf(entityToCheck) <= -1) { // check if this is the first time the entity enters the trigger + this.entitiesInside.push(entityToCheck); + + if(this.onEnter) { + this.onEnter(parentEntity, entityToCheck); + } + } + + if(this.onInside) { + this.onInside(parentEntity, entityToCheck); + } + + } else if(this.entitiesInside.indexOf(entityToCheck) > -1) { // entity WAS inside the trigger + this.entitiesInside.splice(this.entitiesInside.indexOf(entityToCheck), 1); + + if(this.onLeave) { + this.onLeave(parentEntity, entityToCheck); } } } diff --git a/src/game-lib-game.js b/src/game-lib-game.js index 70cdadd..8f70283 100644 --- a/src/game-lib-game.js +++ b/src/game-lib-game.js @@ -31,7 +31,7 @@ GameLib.D3.Game.prototype.render = function( ) { for(var s in this.scenes) { var scene = this.scenes[s]; - scene.render(dt, renderer, camera); + scene.render(dt, renderer, scene.camera); } }; diff --git a/src/game-lib-scene.js b/src/game-lib-scene.js index a838638..4541b06 100644 --- a/src/game-lib-scene.js +++ b/src/game-lib-scene.js @@ -224,10 +224,10 @@ GameLib.D3.Scene.prototype.loadTextures = function(urls, onLoadedCallback) { gameLibTexture.wrapS, gameLibTexture.wrapT, gameLibTexture.magFilter, - gameLibTexture.minFilter, - gameLibTexture.format, - gameLibTexture.textureType, - gameLibTexture.anisotropy + gameLibTexture.minFilter + //gameLibTexture.format, + //gameLibTexture.textureType, + //gameLibTexture.anisotropy ); instanceMaterial[instanceMapId].name = gameLibTexture.name; @@ -735,6 +735,13 @@ GameLib.D3.Scene.FromAPIScene = function( ) }; +/** + * Set on runtime. + */ +GameLib.D3.Scene.prototype.setCamera = function(camera) { + this.sceneCamera = camera; +}; + /** * Updates the scene * @param deltaTime @@ -767,10 +774,11 @@ GameLib.D3.Scene.prototype.lateUpdate = function( */ GameLib.D3.Scene.prototype.render = function( deltaTime, - renderer, - camera + renderer ) { - renderer.render(this.instance, camera); + if(this.sceneCamera) { + renderer.render(this.instance, this.sceneCamera); + } }; /**