Skip to content

Commit a3ee32c

Browse files
committed
Point Screen To World Hit test now works with multiple cameras and camera transforms
1 parent 927c47e commit a3ee32c

2 files changed

Lines changed: 23 additions & 6 deletions

File tree

v3/src/camera/Camera.js

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ var Camera = new Class({
304304
return this;
305305
},
306306

307-
transformPoint: function (pointIn, pointOut)
307+
cameraToScreen: function (pointIn, pointOut)
308308
{
309309
var cameraMatrix = this.matrix.matrix;
310310
var mva = cameraMatrix[0];
@@ -313,16 +313,33 @@ var Camera = new Class({
313313
var mvd = cameraMatrix[3];
314314
var mve = cameraMatrix[4];
315315
var mvf = cameraMatrix[5];
316+
317+
/* First Invert Matrix */
318+
var determinant = (mva * mvd) - (mvb * mvc);
319+
320+
if (!determinant)
321+
return pointIn;
322+
323+
determinant = 1 / determinant;
324+
325+
var ima = mvd * determinant;
326+
var imb = -mvb * determinant;
327+
var imc = -mvc * determinant;
328+
var imd = mva * determinant;
329+
var ime = (mvc * mvf - mvd * mve) * determinant;
330+
var imf = (mvb * mve - mva * mvf) * determinant;
331+
316332
var x = pointIn.x;
317333
var y = pointIn.y;
318334

319335
if (!pointOut)
320336
{
321337
pointOut = {x: 0, y: 0};
322338
}
323-
324-
pointOut.x = (x * mva + y * mvc + mve);
325-
pointOut.y = (x * mvb + y * mvd + mvf);
339+
340+
/* Apply transform to point */
341+
pointOut.x = (x * ima + y * imc + ime);
342+
pointOut.y = (x * imb + y * imd + imf);
326343

327344
return pointOut;
328345
},

v3/src/input/components/PointScreenToWorldHitTest.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ var PointScreenToWorldHitTest = function (tempMatrix, x, y, gameObjectArray, cam
88
var scrollY = camera.scrollY;
99
var cameraW = camera.width;
1010
var cameraH = camera.height;
11-
11+
var screenPoint = camera.cameraToScreen({x: x, y: y});
1212
output.length = 0;
1313

1414
if (gameObjectArray instanceof Array)
@@ -19,7 +19,7 @@ var PointScreenToWorldHitTest = function (tempMatrix, x, y, gameObjectArray, cam
1919
for (var index = 0; index < culledLength; ++index)
2020
{
2121
var object = culled[index];
22-
var tpoint = GetTransformedPoint(tempMatrix, object, x + scrollX * object.scrollFactorX, y + scrollY * object.scrollFactorY);
22+
var tpoint = GetTransformedPoint(tempMatrix, object, screenPoint.x + scrollX * object.scrollFactorX, screenPoint.y + scrollY * object.scrollFactorY);
2323

2424
if (PointWithinGameObject(object, tpoint.x, tpoint.y))
2525
{

0 commit comments

Comments
 (0)