|
|
|
@ -1,12 +1,70 @@ |
|
|
|
|
#include <glm/gtc/matrix_transform.hpp> |
|
|
|
|
#include <glm/gtc/constants.hpp> |
|
|
|
|
#include <glm/ext/matrix_relational.hpp> |
|
|
|
|
#include <glm/ext/scalar_relational.hpp> |
|
|
|
|
|
|
|
|
|
int test_perspective() |
|
|
|
|
{ |
|
|
|
|
int Error = 0; |
|
|
|
|
|
|
|
|
|
glm::mat4 Projection = glm::perspective(glm::pi<float>() * 0.25f, 4.0f / 3.0f, 0.1f, 100.0f); |
|
|
|
|
const float Near = 0.1f; |
|
|
|
|
const float Far = 100.0f; |
|
|
|
|
const float Eps = glm::epsilon<float>(); |
|
|
|
|
|
|
|
|
|
glm::mat4 Projection = glm::perspective(glm::pi<float>() * 0.25f, 4.0f / 3.0f, Near, Far); |
|
|
|
|
|
|
|
|
|
Projection = glm::perspectiveLH_ZO(glm::pi<float>() * 0.25f, 4.0f / 3.0f, Near, Far); |
|
|
|
|
{ |
|
|
|
|
glm::vec4 N = Projection * glm::vec4{0.f, 0.f, Near, 1.f}; |
|
|
|
|
glm::vec4 F = Projection * glm::vec4{0.f, 0.f, Far, 1.f}; |
|
|
|
|
N /= N.w; |
|
|
|
|
F /= F.w; |
|
|
|
|
Error += glm::notEqual(N.z, 0.f, Eps); |
|
|
|
|
Error += glm::notEqual(F.z, 1.f, Eps); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Projection = glm::perspectiveLH_NO(glm::pi<float>() * 0.25f, 4.0f / 3.0f, Near, Far); |
|
|
|
|
{ |
|
|
|
|
glm::vec4 N = Projection * glm::vec4{0.f, 0.f, Near, 1.f}; |
|
|
|
|
glm::vec4 F = Projection * glm::vec4{0.f, 0.f, Far, 1.f}; |
|
|
|
|
N /= N.w; |
|
|
|
|
F /= F.w; |
|
|
|
|
Error += glm::notEqual(N.z, -1.f, Eps); |
|
|
|
|
Error += glm::notEqual(F.z, 1.f, Eps); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return Error; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int test_infinitePerspective() |
|
|
|
|
{ |
|
|
|
|
int Error = 0; |
|
|
|
|
|
|
|
|
|
const float Near = 0.1f; |
|
|
|
|
const float Inf = 1.0e+10f; |
|
|
|
|
const float Eps = glm::epsilon<float>(); |
|
|
|
|
|
|
|
|
|
glm::mat4 Projection = glm::infinitePerspective(glm::pi<float>() * 0.25f, 4.0f / 3.0f, Near); |
|
|
|
|
|
|
|
|
|
Projection = glm::infinitePerspectiveLH_ZO(glm::pi<float>() * 0.25f, 4.0f / 3.0f, Near); |
|
|
|
|
{ |
|
|
|
|
glm::vec4 N = Projection * glm::vec4{0.f, 0.f, Near, 1.f}; |
|
|
|
|
glm::vec4 F = Projection * glm::vec4{0.f, 0.f, Inf, 1.f}; |
|
|
|
|
N /= N.w; |
|
|
|
|
F /= F.w; |
|
|
|
|
Error += glm::notEqual(N.z, 0.f, Eps); |
|
|
|
|
Error += glm::notEqual(F.z, 1.f, Eps); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Projection = glm::infinitePerspectiveLH_NO(glm::pi<float>() * 0.25f, 4.0f / 3.0f, Near); |
|
|
|
|
{ |
|
|
|
|
glm::vec4 N = Projection * glm::vec4{0.f, 0.f, Near, 1.f}; |
|
|
|
|
glm::vec4 F = Projection * glm::vec4{0.f, 0.f, Inf, 1.f}; |
|
|
|
|
N /= N.w; |
|
|
|
|
F /= F.w; |
|
|
|
|
Error += glm::notEqual(N.z, -1.f, Eps); |
|
|
|
|
Error += glm::notEqual(F.z, 1.f, Eps); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return Error; |
|
|
|
|
} |
|
|
|
@ -50,6 +108,7 @@ int main() |
|
|
|
|
Error += test_tweakedInfinitePerspective(); |
|
|
|
|
Error += test_pick(); |
|
|
|
|
Error += test_perspective(); |
|
|
|
|
Error += test_infinitePerspective(); |
|
|
|
|
|
|
|
|
|
return Error; |
|
|
|
|
} |
|
|
|
|