math::project with inverted projection instead original projection

This commit is contained in:
2020-01-30 19:01:18 +07:00
parent f80614d802
commit 8e4ca369ea
3 changed files with 132 additions and 113 deletions

View File

@@ -36,10 +36,14 @@ TEST_CASE("mat4") {
REQUIRE(math::make_rotation_matrix4(make_rad(1.f),v3f(1.f,1.f,1.f)) == math::make_rotation_matrix4(make_rad(1.f), v3f::unit()));
REQUIRE(math::make_orthographic_lh_matrix4(640.f, 480.f, 0.f, 1.f) == math::make_orthographic_lh_matrix4(v2f(640,480), 0.f, 1.f));
REQUIRE(math::make_orthographic_lh_matrix4(-320.f, 320.f, -240.f, 240.f, 0.f, 1.f) == math::make_orthographic_lh_matrix4(-v2f(320,240), v2f(320,240), 0.f, 1.f));
REQUIRE(math::make_orthographic_lh_matrix4(640.0, 480.0, 0.0, 1.0) == math::make_orthographic_lh_matrix4(v2d(640,480), 0.0, 1.0));
REQUIRE(math::make_orthographic_lh_matrix4(-320.0, 320.0, -240.0, 240.0, 0.0, 1.0) == math::make_orthographic_lh_matrix4(-v2d(320,240), v2d(320,240), 0.0, 1.0));
REQUIRE(math::make_orthographic_lh_matrix4(640.f, 480.f, 0.f, 1.f) == math::make_orthographic_lh_matrix4(v2f(640,480), 0.f, 1.f));
REQUIRE(math::make_orthographic_lh_matrix4(640.0, 480.0, 0.0, 1.0) == math::make_orthographic_lh_matrix4(v2d(640,480), 0.0, 1.0));
REQUIRE(math::make_orthographic_rh_matrix4(640.f, 480.f, 0.f, 1.f) == math::make_orthographic_rh_matrix4(v2f(640,480), 0.f, 1.f));
REQUIRE(math::make_orthographic_rh_matrix4(-320.f, 320.f, -240.f, 240.f, 0.f, 1.f) == math::make_orthographic_rh_matrix4(-v2f(320,240), v2f(320,240), 0.f, 1.f));
REQUIRE(math::make_orthographic_rh_matrix4(640.0, 480.0, 0.0, 1.0) == math::make_orthographic_rh_matrix4(v2d(640,480), 0.0, 1.0));
REQUIRE(math::make_orthographic_rh_matrix4(-320.0, 320.0, -240.0, 240.0, 0.0, 1.0) == math::make_orthographic_rh_matrix4(-v2d(320,240), v2d(320,240), 0.0, 1.0));
}
{
REQUIRE(m4f(m4f::identity()) == m4f::identity());
@@ -168,62 +172,57 @@ TEST_CASE("mat4") {
}
{
m4f projection = math::make_perspective_lh_matrix4(make_deg(80.f), 4.f / 3.f, 0.01f, 1.f);
const m4f inv_projection = math::inversed(projection).first;
b2f viewport = make_rect(800.f, 600.f);
const v3f p1 = v3f(0.f,0.f,0.01f);
const v3f p2 = v3f(+1.f,0.f,0.01f);
const v3f p3 = v3f(-1.f,0.f,0.01f);
REQUIRE(math::project(p1, m4f::identity(), projection, viewport).second);
REQUIRE(math::project(p2, m4f::identity(), projection, viewport).second);
REQUIRE(math::project(p3, m4f::identity(), projection, viewport).second);
REQUIRE(math::project(p1, projection, viewport).second);
REQUIRE(math::project(p2, projection, viewport).second);
REQUIRE(math::project(p3, projection, viewport).second);
REQUIRE(math::impl::project_zo(p1, m4f::identity(), projection, viewport).second);
REQUIRE(math::impl::project_zo(p2, m4f::identity(), projection, viewport).second);
REQUIRE(math::impl::project_zo(p3, m4f::identity(), projection, viewport).second);
REQUIRE(math::impl::project_zo(p1, projection, viewport).second);
REQUIRE(math::impl::project_zo(p2, projection, viewport).second);
REQUIRE(math::impl::project_zo(p3, projection, viewport).second);
REQUIRE(math::impl::project_no(p1, m4f::identity(), projection, viewport).second);
REQUIRE(math::impl::project_no(p2, m4f::identity(), projection, viewport).second);
REQUIRE(math::impl::project_no(p3, m4f::identity(), projection, viewport).second);
REQUIRE(math::impl::project_no(p1, projection, viewport).second);
REQUIRE(math::impl::project_no(p2, projection, viewport).second);
REQUIRE(math::impl::project_no(p3, projection, viewport).second);
REQUIRE(math::unproject(
math::project(p1, m4f::identity(), projection, viewport).first,
m4f::identity(),
projection,
math::project(p1, projection, viewport).first,
inv_projection,
viewport).second);
REQUIRE(math::unproject(
math::project(p2, m4f::identity(), projection, viewport).first,
m4f::identity(),
projection,
math::project(p2, projection, viewport).first,
inv_projection,
viewport).second);
REQUIRE(math::unproject(
math::project(p3, m4f::identity(), projection, viewport).first,
m4f::identity(),
projection,
math::project(p3, projection, viewport).first,
inv_projection,
viewport).second);
REQUIRE(math::unproject(
math::project(p1, m4f::identity(), projection, viewport).first,
m4f::identity(),
projection,
math::project(p1, projection, viewport).first,
inv_projection,
viewport).first == v3f(p1));
REQUIRE(math::unproject(
math::project(p2, m4f::identity(), projection, viewport).first,
m4f::identity(),
projection,
math::project(p2, projection, viewport).first,
inv_projection,
viewport).first == v3f(p2));
REQUIRE(math::unproject(
math::project(p3, m4f::identity(), projection, viewport).first,
m4f::identity(),
projection,
math::project(p3, projection, viewport).first,
inv_projection,
viewport).first == v3f(p3));
}
{
m4f projection = math::make_orthographic_lh_matrix4({400.f, 300.f}, 0.f, 1.f);
m4f projection = math::make_orthographic_lh_matrix4(-200.f, 200.f, -300.f, 300.f, 0.f, 1.f);
m4f model = math::make_scale_matrix4(2.f, 2.f);
b2f viewport = make_rect(800.f, 600.f);
@@ -231,93 +230,90 @@ TEST_CASE("mat4") {
const v3f p2 = v3f(+1.f,0.f,0.f);
const v3f p3 = v3f(-1.f,0.f,0.f);
REQUIRE(math::project(p1, model, projection, viewport).second);
REQUIRE(math::project(p2, model, projection, viewport).second);
REQUIRE(math::project(p3, model, projection, viewport).second);
REQUIRE(math::project(p1, model * projection, viewport).second);
REQUIRE(math::project(p2, model * projection, viewport).second);
REQUIRE(math::project(p3, model * projection, viewport).second);
m4f projection_zo = math::impl::make_orthographic_lh_zo_matrix4(400.f, 300.f, 0.f, 1.f);
REQUIRE(math::impl::project_zo(p1, model, projection_zo, viewport).second);
REQUIRE(math::impl::project_zo(p2, model, projection_zo, viewport).second);
REQUIRE(math::impl::project_zo(p3, model, projection_zo, viewport).second);
m4f projection_zo = math::impl::make_orthographic_lh_zo_matrix4(-200.f, 200.f, -150.f, 150.f, 0.f, 1.f);
REQUIRE(math::impl::project_zo(p1, model * projection_zo, viewport).second);
REQUIRE(math::impl::project_zo(p2, model * projection_zo, viewport).second);
REQUIRE(math::impl::project_zo(p3, model * projection_zo, viewport).second);
m4f projection_no = math::impl::make_orthographic_lh_no_matrix4(400.f, 300.f, 0.f, 1.f);
REQUIRE(math::impl::project_no(p1, model, projection_no, viewport).second);
REQUIRE(math::impl::project_no(p2, model, projection_no, viewport).second);
REQUIRE(math::impl::project_no(p3, model, projection_no, viewport).second);
m4f projection_no = math::impl::make_orthographic_lh_no_matrix4(-200.f, 200.f, -150.f, 150.f, 0.f, 1.f);
REQUIRE(math::impl::project_no(p1, model * projection_no, viewport).second);
REQUIRE(math::impl::project_no(p2, model * projection_no, viewport).second);
REQUIRE(math::impl::project_no(p3, model * projection_no, viewport).second);
REQUIRE(math::approximately(
math::project(p1, model, projection, viewport).first,
math::project(p1, model * projection, viewport).first,
v3f(400.f, 300.f, 0.f),
0.01f));
REQUIRE(math::approximately(
math::project(p2, model, projection, viewport).first,
math::project(p2, model * projection, viewport).first,
v3f(404.f, 300.f, 0.f),
0.01f));
REQUIRE(math::approximately(
math::project(p3, model, projection, viewport).first,
math::project(p3, model * projection, viewport).first,
v3f(396.f, 300.f, 0.f),
0.01f));
REQUIRE(math::approximately(
math::impl::project_zo(p1, model, projection_zo, viewport).first,
math::impl::project_zo(p1, model * projection_zo, viewport).first,
v3f(400.f, 300.f, 0.f),
0.01f));
REQUIRE(math::approximately(
math::impl::project_zo(p2, model, projection_zo, viewport).first,
math::impl::project_zo(p2, model * projection_zo, viewport).first,
v3f(404.f, 300.f, 0.f),
0.01f));
REQUIRE(math::approximately(
math::impl::project_zo(p3, model, projection_zo, viewport).first,
math::impl::project_zo(p3, model * projection_zo, viewport).first,
v3f(396.f, 300.f, 0.f),
0.01f));
REQUIRE(math::approximately(
math::impl::project_no(p1, model, projection_no, viewport).first,
math::impl::project_no(p1, model * projection_no, viewport).first,
v3f(400.f, 300.f, 0.f),
0.01f));
REQUIRE(math::approximately(
math::impl::project_no(p2, model, projection_no, viewport).first,
math::impl::project_no(p2, model * projection_no, viewport).first,
v3f(404.f, 300.f, 0.f),
0.01f));
REQUIRE(math::approximately(
math::impl::project_no(p3, model, projection_no, viewport).first,
math::impl::project_no(p3, model * projection_no, viewport).first,
v3f(396.f, 300.f, 0.f),
0.01f));
const m4f inv_project = math::inversed(model * projection).first;
REQUIRE(math::inversed(model * projection).second);
REQUIRE(math::unproject(
math::project(p1, model, projection, viewport).first,
model,
projection,
math::project(p1, inv_project, viewport).first,
model * projection,
viewport).second);
REQUIRE(math::unproject(
math::project(p2, model, projection, viewport).first,
model,
projection,
math::project(p2, inv_project, viewport).first,
model * projection,
viewport).second);
REQUIRE(math::unproject(
math::project(p3, model, projection, viewport).first,
model,
projection,
math::project(p3, inv_project, viewport).first,
model * projection,
viewport).second);
REQUIRE(math::unproject(
math::project(p1, model, projection, viewport).first,
model,
projection,
math::project(p1, inv_project, viewport).first,
model * projection,
viewport).first == v3f(p1));
REQUIRE(math::unproject(
math::project(p2, model, projection, viewport).first,
model,
projection,
math::project(p2, inv_project, viewport).first,
model * projection,
viewport).first == v3f(p2));
REQUIRE(math::unproject(
math::project(p3, model, projection, viewport).first,
model,
projection,
math::project(p3, inv_project, viewport).first,
model * projection,
viewport).first == v3f(p3));
}
}