#include #include #include "parse.hpp" #include "scan.hpp" namespace { TEST(ParseFaceData, BuildsTrianglesAndIndexSets) { wavefront::scan_result scan_result; scan_result.total_lines = 26; scan_result.line_data = { {17u, "f 1/1/1 2/2/2 3/3/2"}, {19u, "f 4/3/2 5/2/1 6/1/2"}, {21u, "f 7/2/2 8/3/2 9/1/1"}, {23u, "f 8/1/1 5/2/2 3/3/2"}, {25u, "f 2/1/1 6/2/2 4/3/2"} }; scan_result.category_map = { {"f", {17u, 19u, 21u, 23u, 25u}} }; const auto face_data = wavefront::parse_face_data(scan_result); EXPECT_EQ(face_data.triangle_list.size(), 5u); EXPECT_EQ(face_data.index_position_set.size(), 9u); EXPECT_TRUE(face_data.index_position_set.contains(1)); EXPECT_TRUE(face_data.index_position_set.contains(9)); EXPECT_EQ(face_data.index_normal_set.size(), 2u); EXPECT_TRUE(face_data.index_normal_set.contains(1)); EXPECT_TRUE(face_data.index_normal_set.contains(2)); EXPECT_EQ(face_data.index_texcoord_set.size(), 3u); EXPECT_TRUE(face_data.index_texcoord_set.contains(1)); EXPECT_TRUE(face_data.index_texcoord_set.contains(3)); const auto &first_triangle = face_data.triangle_list.at(0); EXPECT_EQ(first_triangle[0].face_line_number, 17u); EXPECT_EQ(first_triangle[0].position_index, 1); EXPECT_EQ(first_triangle[0].texcoord_index, 1); EXPECT_EQ(first_triangle[0].normal_index, 1); } TEST(ParseCoordinateData, MapsCoordinatesWithoutParsingFaces) { wavefront::scan_result scan_result; scan_result.total_lines = 26; scan_result.line_data = { {3u, "v 0.1 0.2 0.3"}, {4u, "v 0.2 0.3 0.4"}, {5u, "v 0.3 0.4 0.5"}, {6u, "v 1.1 1.2 1.3"}, {7u, "v 1.2 1.3 1.4"}, {8u, "v 1.3 1.4 1.5"}, {9u, "v 2.1 2.2 2.3"}, {10u, "v 2.2 2.3 2.4"}, {11u, "v 2.3 2.4 2.5"}, {12u, "vn 0.15 0.25 0.35"}, {13u, "vn 0.25 0.35 0.45"}, {14u, "vn 0.35 0.45 0.55"}, {15u, "vt 0.9 0.8"}, {16u, "vt 0.8 0.7"}, {17u, "f 1/1/1 2/2/2 3/3/2"}, {19u, "f 4/3/2 5/2/1 6/1/2"}, {21u, "f 7/2/2 8/3/2 9/1/1"}, {23u, "f 8/1/1 5/2/2 3/3/2"}, {25u, "f 2/1/1 6/2/2 4/3/2"} }; scan_result.category_map = { {"v", {0u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u}}, {"vn", {0u, 12u, 13u, 14u}}, {"vt", {0u, 15u, 16u}}, {"f", {17u, 19u, 21u, 23u, 25u}} }; wavefront::wavefront_face_data_result_t face_data; face_data.index_position_set = {1, 2, 3, 4, 5, 6, 7, 8, 9}; face_data.index_normal_set = {1, 2, 3}; face_data.index_texcoord_set = {1, 2}; face_data.triangle_list = { {{{17u, 1, 1, 1}, {17u, 2, 2, 2}, {17u, 3, 3, 2}}}, {{{19u, 4, 3, 2}, {19u, 5, 2, 1}, {19u, 6, 1, 2}}}, {{{21u, 7, 2, 2}, {21u, 8, 3, 2}, {21u, 9, 1, 1}}}, {{{23u, 8, 1, 1}, {23u, 5, 2, 2}, {23u, 3, 3, 2}}}, {{{25u, 2, 1, 1}, {25u, 6, 2, 2}, {25u, 4, 3, 2}}} }; const auto coordinate_data = wavefront::parse_coordinate_data(scan_result, face_data); ASSERT_EQ(coordinate_data.position_coordinates.size(), 9u); const auto &pos_line_2 = coordinate_data.position_coordinates.at(3u); EXPECT_FLOAT_EQ(pos_line_2[0], 0.1f); EXPECT_FLOAT_EQ(pos_line_2[1], 0.2f); EXPECT_FLOAT_EQ(pos_line_2[2], 0.3f); const auto &pos_line_5 = coordinate_data.position_coordinates.at(6u); EXPECT_FLOAT_EQ(pos_line_5[0], 1.1f); EXPECT_FLOAT_EQ(pos_line_5[1], 1.2f); EXPECT_FLOAT_EQ(pos_line_5[2], 1.3f); const auto &pos_line_10 = coordinate_data.position_coordinates.at(11u); EXPECT_FLOAT_EQ(pos_line_10[0], 2.3f); EXPECT_FLOAT_EQ(pos_line_10[1], 2.4f); EXPECT_FLOAT_EQ(pos_line_10[2], 2.5f); ASSERT_EQ(coordinate_data.normal_coordinates.size(), 3u); const auto &normal_line_11 = coordinate_data.normal_coordinates.at(12u); EXPECT_FLOAT_EQ(normal_line_11[0], 0.15f); EXPECT_FLOAT_EQ(normal_line_11[1], 0.25f); EXPECT_FLOAT_EQ(normal_line_11[2], 0.35f); const auto &normal_line_13 = coordinate_data.normal_coordinates.at(14u); EXPECT_FLOAT_EQ(normal_line_13[0], 0.35f); EXPECT_FLOAT_EQ(normal_line_13[1], 0.45f); EXPECT_FLOAT_EQ(normal_line_13[2], 0.55f); ASSERT_EQ(coordinate_data.texture_coordinates.index(), 2u); const auto &texcoords = std::get<2>(coordinate_data.texture_coordinates); ASSERT_EQ(texcoords.size(), 2u); const auto &tex_line_14 = texcoords.at(15u); EXPECT_FLOAT_EQ(tex_line_14[0], 0.9f); EXPECT_FLOAT_EQ(tex_line_14[1], 0.8f); const auto &tex_line_15 = texcoords.at(16u); EXPECT_FLOAT_EQ(tex_line_15[0], 0.8f); EXPECT_FLOAT_EQ(tex_line_15[1], 0.7f); } }