From 9a34ce71ac4ca719ba94c2f5bb36faf483e63b67 Mon Sep 17 00:00:00 2001 From: Richard Davey Date: Tue, 18 Jul 2017 02:35:55 +0100 Subject: [PATCH] Added Camera Hit Test specific cull --- v3/src/camera/Camera.js | 1 + v3/src/camera/components/CullHitTest.js | 67 +++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 v3/src/camera/components/CullHitTest.js diff --git a/v3/src/camera/Camera.js b/v3/src/camera/Camera.js index 0116f57d4..fc6a076f1 100644 --- a/v3/src/camera/Camera.js +++ b/v3/src/camera/Camera.js @@ -67,6 +67,7 @@ var Camera = new Class({ centerToBounds: require('./components/CenterToBounds'), centerToSize: require('./components/CenterToSize'), cull: require('./components/Cull'), + cullHitTest: require('./components/CullHitTest'), destroy: require('./components/Destroy'), fade: require('./components/Fade'), flash: require('./components/Flash'), diff --git a/v3/src/camera/components/CullHitTest.js b/v3/src/camera/components/CullHitTest.js new file mode 100644 index 000000000..39955ba33 --- /dev/null +++ b/v3/src/camera/components/CullHitTest.js @@ -0,0 +1,67 @@ +var CullHitTest = function (interactiveObjects) +{ + if (this.disableCull) + { + return interactiveObjects; + } + + var cameraMatrix = this.matrix.matrix; + + var mva = cameraMatrix[0]; + var mvb = cameraMatrix[1]; + var mvc = cameraMatrix[2]; + var mvd = cameraMatrix[3]; + + /* First Invert Matrix */ + var determinant = (mva * mvd) - (mvb * mvc); + + if (!determinant) + { + return interactiveObjects; + } + + var mve = cameraMatrix[4]; + var mvf = cameraMatrix[5]; + + var scrollX = this.scrollX; + var scrollY = this.scrollY; + var cameraW = this.width; + var cameraH = this.height; + var length = interactiveObjects.length; + + determinant = 1 / determinant; + + var culledObjects = []; + + for (var index = 0; index < length; ++index) + { + var object = interactiveObjects[index].gameObject; + + if (!object.hasOwnProperty('width')) + { + culledObjects.push(interactiveObjects[index]); + continue; + } + + 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 tx = (objectX * mva + objectY * mvc + mve); + var ty = (objectX * mvb + objectY * mvd + mvf); + var tw = ((objectX + objectW) * mva + (objectY + objectH) * mvc + mve); + var th = ((objectX + objectW) * mvb + (objectY + objectH) * mvd + mvf); + var cullW = cameraW + objectW; + var cullH = cameraH + objectH; + + if (tx > -objectW || ty > -objectH || tx < cullW || ty < cullH || + tw > -objectW || th > -objectH || tw < cullW || th < cullH) + { + culledObjects.push(interactiveObjects[index]); + } + } + + return culledObjects; +}; + +module.exports = CullHitTest;