[Bf-blender-cvs] [198f8d5e99b] soc-2021-adaptive-cloth: adaptive_cloth: tests: MeshIO: read DNA Mesh loose edges

ishbosamiya noreply at git.blender.org
Mon Jul 5 17:33:39 CEST 2021


Commit: 198f8d5e99b41b4860e8fe28f2bdab1980ef877f
Author: ishbosamiya
Date:   Fri Jul 2 20:35:03 2021 +0530
Branches: soc-2021-adaptive-cloth
https://developer.blender.org/rB198f8d5e99b41b4860e8fe28f2bdab1980ef877f

adaptive_cloth: tests: MeshIO: read DNA Mesh loose edges

===================================================================

M	source/blender/blenkernel/tests/BKE_cloth_remesh_test.cc

===================================================================

diff --git a/source/blender/blenkernel/tests/BKE_cloth_remesh_test.cc b/source/blender/blenkernel/tests/BKE_cloth_remesh_test.cc
index 787550f0c3a..74f71ccfe12 100644
--- a/source/blender/blenkernel/tests/BKE_cloth_remesh_test.cc
+++ b/source/blender/blenkernel/tests/BKE_cloth_remesh_test.cc
@@ -282,6 +282,11 @@ TEST(cloth_remesh, MeshIO_ReadDNAMesh)
   BMeshToMeshParams bmesh_to_mesh_params = {0};
   bmesh_to_mesh_params.cd_mask_extra = CD_MASK_MESH;
 
+  /* This is a necessary evil because the MVert, MPoly, etc. blocks
+   * stored per element in the BMesh have not been updated for some
+   * reason. Would be nice to know what causes this. This was the best
+   * fix found as of now.
+   **/
   auto *bm_copy = BM_mesh_copy(bm);
 
   auto *result = BKE_mesh_new_nomain(0, 0, 0, 0, 0);
@@ -352,6 +357,194 @@ TEST(cloth_remesh, MeshIO_ReadDNAMesh)
   EXPECT_EQ(stream_out.str(), expected);
 }
 
+TEST(cloth_remesh, MeshIO_ReadDNAMesh_LooseEdges)
+{
+  BKE_idtype_init();
+  MeshIO reader;
+  auto *mesh = BKE_mesh_new_nomain(0, 0, 0, 0, 0);
+  CustomData_add_layer(&mesh->ldata, CD_MLOOPUV, CD_CALLOC, nullptr, 0);
+  BMeshCreateParams bmesh_create_params = {0};
+  bmesh_create_params.use_toolflags = true;
+  BMeshFromMeshParams bmesh_from_mesh_params = {0};
+  bmesh_from_mesh_params.cd_mask_extra = CD_MASK_MESH;
+
+  auto *bm = BKE_mesh_to_bmesh_ex(mesh, &bmesh_create_params, &bmesh_from_mesh_params);
+
+  blender::Vector<float3> pos_data;
+  pos_data.append(float3(1.0, 0.0, 1.0));
+  pos_data.append(float3(1.0, 0.0, -1.0));
+  pos_data.append(float3(-1.0, 0.0, -1.0));
+  pos_data.append(float3(-1.0, 0.0, 1.0));
+  pos_data.append(float3(1.0, 0.0, 2.0));
+
+  pos_data.append(float3(2.0, 0.0, 1.0));
+  pos_data.append(float3(2.0, 0.0, -1.0));
+  pos_data.append(float3(3.0, 0.0, 1.0));
+  pos_data.append(float3(3.0, 0.0, -1.0));
+  pos_data.append(float3(1.0, 0.0, -2.0));
+
+  pos_data.append(float3(-1.0, 0.0, -2.0));
+  pos_data.append(float3(-2.0, 0.0, -1.0));
+  pos_data.append(float3(-2.0, 0.0, 1.0));
+  pos_data.append(float3(-1.0, 0.0, 2.0));
+
+  blender::Vector<BMVert *> bm_verts;
+  for (const auto &pos : pos_data) {
+    float pos_v3[3];
+    copy_v3_float3(pos_v3, pos);
+    auto *bm_vert = BM_vert_create(bm, pos_v3, nullptr, BM_CREATE_NOP);
+    bm_verts.append(bm_vert);
+  }
+  BLI_assert(bm_verts.size() == 14);
+
+  auto *bm_face = BM_face_create_quad_tri(
+      bm, bm_verts[0], bm_verts[1], bm_verts[2], bm_verts[3], nullptr, BM_CREATE_NOP);
+
+  BM_edge_create(bm, bm_verts[0], bm_verts[5], nullptr, BM_CREATE_NOP);
+  BM_edge_create(bm, bm_verts[5], bm_verts[6], nullptr, BM_CREATE_NOP);
+  BM_edge_create(bm, bm_verts[6], bm_verts[1], nullptr, BM_CREATE_NOP);
+
+  BM_edge_create(bm, bm_verts[1], bm_verts[9], nullptr, BM_CREATE_NOP);
+  BM_edge_create(bm, bm_verts[9], bm_verts[10], nullptr, BM_CREATE_NOP);
+  BM_edge_create(bm, bm_verts[10], bm_verts[2], nullptr, BM_CREATE_NOP);
+
+  BM_edge_create(bm, bm_verts[2], bm_verts[11], nullptr, BM_CREATE_NOP);
+  BM_edge_create(bm, bm_verts[11], bm_verts[12], nullptr, BM_CREATE_NOP);
+  BM_edge_create(bm, bm_verts[12], bm_verts[3], nullptr, BM_CREATE_NOP);
+
+  BM_edge_create(bm, bm_verts[3], bm_verts[13], nullptr, BM_CREATE_NOP);
+  BM_edge_create(bm, bm_verts[13], bm_verts[4], nullptr, BM_CREATE_NOP);
+  BM_edge_create(bm, bm_verts[4], bm_verts[0], nullptr, BM_CREATE_NOP);
+
+  BM_edge_create(bm, bm_verts[1], bm_verts[9], nullptr, BM_CREATE_NOP);
+  BM_edge_create(bm, bm_verts[9], bm_verts[10], nullptr, BM_CREATE_NOP);
+  BM_edge_create(bm, bm_verts[10], bm_verts[2], nullptr, BM_CREATE_NOP);
+
+  BM_edge_create(bm, bm_verts[7], bm_verts[8], nullptr, BM_CREATE_NOP);
+
+  /* UV gen */
+  {
+    BMLoop *l;
+    BMIter liter;
+    usize loop_index;
+    auto cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
+    auto dx = 1.0;
+    auto dy = 1.0;
+    auto x = 0.0;
+    auto y = dy;
+    auto dx_wrap = 1.0 - (dx / 2.0);
+    BM_ITER_ELEM_INDEX (l, &liter, bm_face, BM_LOOPS_OF_FACE, loop_index) {
+      MLoopUV *luv = static_cast<MLoopUV *>(BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset));
+
+      switch (loop_index) {
+        case 0:
+          y -= dy;
+          break;
+        case 1:
+          x += dx;
+          break;
+        case 2:
+          y += dy;
+          break;
+        case 3:
+          x -= dx;
+          break;
+        default:
+          break;
+      }
+
+      luv->uv[0] = x;
+      luv->uv[1] = y;
+    }
+
+    x += dx;
+    if (x >= dx_wrap) {
+      x = 0.0f;
+      y += dy;
+    }
+  }
+
+  BMeshToMeshParams bmesh_to_mesh_params = {0};
+  bmesh_to_mesh_params.cd_mask_extra = CD_MASK_MESH;
+
+  /* This is a necessary evil because the MVert, MPoly, etc. blocks
+   * stored per element in the BMesh have not been updated for some
+   * reason. Would be nice to know what causes this. This was the best
+   * fix found as of now.
+   **/
+  auto *bm_copy = BM_mesh_copy(bm);
+
+  auto *result = BKE_mesh_new_nomain(0, 0, 0, 0, 0);
+  BM_mesh_bm_to_me(nullptr, bm_copy, result, &bmesh_to_mesh_params);
+
+  BKE_mesh_calc_normals(result);
+
+  auto res = reader.read(result);
+
+  EXPECT_TRUE(res);
+
+  BM_mesh_free(bm);
+  BM_mesh_free(bm_copy);
+  BKE_mesh_eval_delete(mesh);
+  BKE_mesh_eval_delete(result);
+
+  std::ostringstream stream_out;
+  reader.write(stream_out, MeshIO::IOTYPE_OBJ);
+
+  std::string expected =
+      "v 1 0 1\n"
+      "v 1 0 -1\n"
+      "v -1 0 -1\n"
+      "v -1 0 1\n"
+      "v 1 0 2\n"
+      "v 2 0 1\n"
+      "v 2 0 -1\n"
+      "v 3 0 1\n"
+      "v 3 0 -1\n"
+      "v 1 0 -2\n"
+      "v -1 0 -2\n"
+      "v -2 0 -1\n"
+      "v -2 0 1\n"
+      "v -1 0 2\n"
+      "vt 0 0\n"
+      "vt 1 0\n"
+      "vt 1 1\n"
+      "vt 0 1\n"
+      "vn 0 1 0\n"
+      "vn 0 1 0\n"
+      "vn 0 1 0\n"
+      "vn 0 1 0\n"
+      "vn 0.447188 0 0.894406\n"
+      "vn 0.894406 0 0.447188\n"
+      "vn 0.894406 0 -0.447188\n"
+      "vn 0.948668 0 0.316202\n"
+      "vn 0.948668 0 -0.316202\n"
+      "vn 0.447188 0 -0.894406\n"
+      "vn -0.447188 0 -0.894406\n"
+      "vn -0.894406 0 -0.447188\n"
+      "vn -0.894406 0 0.447188\n"
+      "vn -0.447188 0 0.894406\n"
+      "f 1/1/1 2/2/2 3/3/3 4/4/4 \n"
+      "l 1 6 \n"
+      "l 6 7 \n"
+      "l 7 2 \n"
+      "l 2 10 \n"
+      "l 10 11 \n"
+      "l 11 3 \n"
+      "l 3 12 \n"
+      "l 12 13 \n"
+      "l 13 4 \n"
+      "l 4 14 \n"
+      "l 14 5 \n"
+      "l 5 1 \n"
+      "l 2 10 \n"
+      "l 10 11 \n"
+      "l 11 3 \n"
+      "l 8 9 \n";
+
+  EXPECT_EQ(stream_out.str(), expected);
+}
+
 TEST(cloth_remesh, MeshIO_WriteDNAMesh)
 {
   MeshIO reader;



More information about the Bf-blender-cvs mailing list