From ebea1168096e876e053a659773e8cd85dd0c6b91 Mon Sep 17 00:00:00 2001 From: Felipe Alfonso Date: Fri, 7 Jul 2017 15:59:17 -0400 Subject: [PATCH] PointScreenToWorldHitTest added to Global Input Manager --- v3/src/camera/Camera.js | 25 +++++++---- v3/src/camera/IntersectGameObject.js | 6 --- v3/src/input/GlobalInputManager.js | 7 +++ .../components/PointScreenToWorldHitTest.js | 45 +++++++++++++++++++ 4 files changed, 69 insertions(+), 14 deletions(-) delete mode 100644 v3/src/camera/IntersectGameObject.js create mode 100644 v3/src/input/components/PointScreenToWorldHitTest.js diff --git a/v3/src/camera/Camera.js b/v3/src/camera/Camera.js index 092425446..a54724dcd 100644 --- a/v3/src/camera/Camera.js +++ b/v3/src/camera/Camera.js @@ -70,15 +70,24 @@ var Camera = new Class({ for (var index = 0; index < length; ++index) { var object = renderableObjects[index]; - var objectW = object.width; - var objectH = object.height; - var objectX = (object.x - (scrollX * object.scrollFactorX)) - (objectW * object.originX); - var objectY = (object.y - (scrollY * object.scrollFactorY)) - (objectH * object.originY); - var cullW = cameraW + objectW; - var cullH = cameraH + objectH; - if (objectX > -objectW && objectY > -objectH && - objectX < cullW && objectY < cullH) + /* Not every renderable object has a dimension */ + if (typeof object.width === 'number') + { + var objectW = object.width; + var objectH = object.height; + var objectX = (object.x - (scrollX * object.scrollFactorX)) - (objectW * object.originX); + var objectY = (object.y - (scrollY * object.scrollFactorY)) - (objectH * object.originY); + var cullW = cameraW + objectW; + var cullH = cameraH + objectH; + + if (objectX > -objectW && objectY > -objectH && + objectX < cullW && objectY < cullH) + { + culledObjects.push(object); + } + } + else { culledObjects.push(object); } diff --git a/v3/src/camera/IntersectGameObject.js b/v3/src/camera/IntersectGameObject.js deleted file mode 100644 index 150841e7a..000000000 --- a/v3/src/camera/IntersectGameObject.js +++ /dev/null @@ -1,6 +0,0 @@ -var IntersectGameObject = function (point, gameObjectArray, camera) -{ - return false; -}; - -module.exports = IntersectGameObject; diff --git a/v3/src/input/GlobalInputManager.js b/v3/src/input/GlobalInputManager.js index 8097c46eb..b19e6a7ab 100644 --- a/v3/src/input/GlobalInputManager.js +++ b/v3/src/input/GlobalInputManager.js @@ -8,6 +8,7 @@ var Mouse = require('./mouse/MouseManager'); var MouseEvent = require('./mouse/events/'); var PointWithinGameObject = require('./components/PointWithinGameObject'); var TransformMatrix = require('../gameobjects/components/TransformMatrix'); +var PointScreenToWorldHitTest = require('./components/PointScreenToWorldHitTest'); var GlobalInputManager = new Class({ @@ -32,6 +33,7 @@ var GlobalInputManager = new Class({ this._tempMatrix = new TransformMatrix(); this._tempPoint = { x: 0, y: 0 }; + this._tempHitTest = []; }, /** @@ -92,6 +94,11 @@ var GlobalInputManager = new Class({ pointWithinGameObject: function (gameObject, x, y) { return PointWithinGameObject(gameObject, x, y); + }, + + pointScreenToWorldHitTest: function (gameObjects, x, y, camera) + { + return PointScreenToWorldHitTest(this._tempMatrix, x, y, gameObjects, camera, this._tempHitTest); } }); diff --git a/v3/src/input/components/PointScreenToWorldHitTest.js b/v3/src/input/components/PointScreenToWorldHitTest.js new file mode 100644 index 000000000..6a0137a50 --- /dev/null +++ b/v3/src/input/components/PointScreenToWorldHitTest.js @@ -0,0 +1,45 @@ +var GetTransformedPoint = require('./GetTransformedPoint'); +var PointWithinGameObject = require('./PointWithinGameObject'); + +var PointScreenToWorldHitTest = function (tempMatrix, x, y, gameObjectArray, camera, output) +{ + var length = gameObjectArray.length; + var scrollX = camera.scrollX; + var scrollY = camera.scrollY; + var cameraW = camera.width; + var cameraH = camera.height; + + output.length = 0; + + if (gameObjectArray instanceof Array) + { + var culled = camera.cull(gameObjectArray); + var culledLength = culled.length; + + for (var index = 0; index < culledLength; ++index) + { + var object = culled[index]; + var tpoint = GetTransformedPoint(tempMatrix, object, x + scrollX * object.scrollFactorX, y + scrollY * object.scrollFactorY); + + if (PointWithinGameObject(object, tpoint.x, tpoint.y)) + { + output.push(object); + } + } + + return output; + } + else + { + var tpoint = GetTransformedPoint(tempMatrix, object, x + scrollX * object.scrollFactorX, y + scrollY * object.scrollFactorY); + + if (PointWithinGameObject(object, tpoint.x, tpoint.y)) + { + return object; + } + } + + return null; +}; + +module.exports = PointScreenToWorldHitTest;