diff --git a/src/rendering/camera.c b/src/rendering/camera.c index 1556f61..8967525 100644 --- a/src/rendering/camera.c +++ b/src/rendering/camera.c @@ -309,6 +309,11 @@ Vector3 cameraUnproject(CameraDefinition* camera, Vector3 point) { point.x = (point.x / (0.5 * camera->width) - 1.0); point.y = -(point.y / (0.5 * camera->height) - 1.0); + if (point.z < 1.0) + { + point.x = -point.x; + point.y = -point.y; + } return m4Transform(camera->unproject, point); } diff --git a/src/testing/test_camera.c b/src/testing/test_camera.c index 0fc2143..3cff93f 100644 --- a/src/testing/test_camera.c +++ b/src/testing/test_camera.c @@ -29,6 +29,9 @@ START_TEST(test_camera_projection) Vector3 point = cameraProject(cam, v3(12.0, 5.2, -6.3)); point = cameraUnproject(cam, point); ck_assert_vector_values(point, 12.0, 5.2, -6.3); + point = cameraProject(cam, v3(-25.1, 8.3, 1.3)); + point = cameraUnproject(cam, point); + ck_assert_vector_values(point, -25.1, 8.3, 1.3); cameraDeleteDefinition(cam); } @@ -45,6 +48,10 @@ START_TEST(test_camera_depth) /* Test the real depth getter */ Vector3 point = cameraProject(cam, v3(12.5, 0.0, 0.0)); ck_assert_double_eq(cameraGetRealDepth(cam, point), 12.5); + point = cameraProject(cam, v3(12.5, 8.0, -3.0)); + ck_assert_double_eq(cameraGetRealDepth(cam, point), 12.5); + point = cameraProject(cam, v3(12.5, 12.0, 58.0)); + ck_assert_double_eq(cameraGetRealDepth(cam, point), 12.5); cameraDeleteDefinition(cam); }