map_texture.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include <test_common.h>
  2. #include <igl/opengl/glfw/map_texture.h>
  3. TEST_CASE("map_texture: identity","[igl/glfw]")
  4. {
  5. // 2 triangle quad
  6. Eigen::MatrixXd V(4,3);
  7. V<<0,0,0,
  8. 1,0,0,
  9. 1,1,0,
  10. 0,1,0;
  11. Eigen::MatrixXi F(2,3);
  12. F<<0,1,2,
  13. 0,2,3;
  14. // Random RGBA texture
  15. const int in_w = 16;
  16. const int in_h = 16;
  17. const int in_nc = 4;
  18. using ArrayXuc = Eigen::Array<unsigned char,Eigen::Dynamic,1>;
  19. ArrayXuc in_rgba = ArrayXuc::Random(in_h*in_w*in_nc,1);
  20. std::vector<unsigned char> out_rgba;
  21. int out_w, out_h, out_nc;
  22. igl::opengl::glfw::map_texture(
  23. V,F,V,
  24. in_rgba.data(),
  25. in_w,in_h,in_nc,
  26. out_rgba,
  27. out_w,out_h,out_nc);
  28. REQUIRE(out_w == in_w);
  29. REQUIRE(out_h == in_h);
  30. REQUIRE(out_nc == in_nc);
  31. {
  32. // Map in_rgb
  33. Eigen::Map<ArrayXuc> out_rgba_map(out_rgba.data(),out_w*out_h*out_nc,1);
  34. REQUIRE(out_rgba_map.isApprox(in_rgba,0));
  35. }
  36. }
  37. TEST_CASE("map_texture: transpose","[igl/glfw]")
  38. {
  39. // 2 triangle quad
  40. Eigen::MatrixXd V(4,3);
  41. V<<0,0,0,
  42. 1,0,0,
  43. 1,1,0,
  44. 0,1,0;
  45. Eigen::MatrixXi F(2,3);
  46. F<<0,1,2,
  47. 0,2,3;
  48. // Random RGBA texture
  49. const int in_w = 16;
  50. const int in_h = 16;
  51. const int in_nc = 4;
  52. using ArrayXuc = Eigen::Array<unsigned char,Eigen::Dynamic,1>;
  53. ArrayXuc in_rgba = ArrayXuc::Random(in_h*in_w*in_nc,1);
  54. std::vector<unsigned char> out_rgba;
  55. int out_w, out_h, out_nc;
  56. Eigen::MatrixXd U(4,3);
  57. U<<
  58. 1,1,0,
  59. 1,0,0,
  60. 0,0,0,
  61. 0,1,0;
  62. igl::opengl::glfw::map_texture(
  63. V,F,U,
  64. in_rgba.data(),
  65. in_w,in_h,in_nc,
  66. out_rgba,
  67. out_w,out_h,out_nc);
  68. REQUIRE(out_w == in_w);
  69. REQUIRE(out_h == in_h);
  70. REQUIRE(out_nc == in_nc);
  71. {
  72. // Treat each 4 unsigned chars as a single int32_t and then transpose
  73. using FourChars = std::int32_t;
  74. Eigen::Map<Eigen::Array<FourChars,Eigen::Dynamic,Eigen::Dynamic>>
  75. pixel_map(reinterpret_cast<FourChars*>(out_rgba.data()), out_w,out_h);
  76. pixel_map.transposeInPlace();
  77. // Array of chars
  78. Eigen::Map<ArrayXuc> out_rgba_map(out_rgba.data(),out_w*out_h*out_nc,1);
  79. REQUIRE(out_rgba_map.isApprox(in_rgba,0));
  80. }
  81. }