[Bf-blender-cvs] [13b331e0896] refactor-mesh-corners-generic: Merge branch 'refactor-mesh-position-generic' into refactor-mesh-corners-generic

Hans Goudey noreply at git.blender.org
Tue Dec 6 23:01:56 CET 2022


Commit: 13b331e08965ae64c6b7e3d695656d2087e366e3
Author: Hans Goudey
Date:   Tue Dec 6 15:53:30 2022 -0600
Branches: refactor-mesh-corners-generic
https://developer.blender.org/rB13b331e08965ae64c6b7e3d695656d2087e366e3

Merge branch 'refactor-mesh-position-generic' into refactor-mesh-corners-generic

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



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

diff --cc source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc
index 148485b3919,1fc5f08675e..230a740709d
--- a/source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc
+++ b/source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc
@@@ -33,12 -33,16 +33,16 @@@ OBJMesh::OBJMesh(Depsgraph *depsgraph, 
    /* We need to copy the object because it may be in temporary space. */
    Object *obj_eval = DEG_get_evaluated_object(depsgraph, mesh_object);
    export_object_eval_ = dna::shallow_copy(*obj_eval);
-   export_mesh_eval_ = export_params.apply_modifiers ?
-                           BKE_object_get_evaluated_mesh(&export_object_eval_) :
-                           BKE_object_get_pre_modified_mesh(&export_object_eval_);
-   mesh_eval_needs_free_ = false;
- 
-   if (!export_mesh_eval_) {
+   export_mesh_ = export_params.apply_modifiers ?
+                      BKE_object_get_evaluated_mesh(&export_object_eval_) :
+                      BKE_object_get_pre_modified_mesh(&export_object_eval_);
+   if (export_mesh_) {
+     mesh_positions_ = export_mesh_->positions();
+     mesh_edges_ = export_mesh_->edges();
+     mesh_polys_ = export_mesh_->polys();
 -    mesh_loops_ = export_mesh_->loops();
++    mesh_corner_verts_ = export_mesh_->corner_verts();
+   }
+   else {
      /* Curves and NURBS surfaces need a new mesh when they're
       * exported in the form of vertices and edges.
       */
@@@ -60,13 -62,17 +62,17 @@@ OBJMesh::~OBJMesh(
    clear();
  }
  
- void OBJMesh::free_mesh_if_needed()
+ void OBJMesh::set_mesh(Mesh *mesh)
  {
-   if (mesh_eval_needs_free_ && export_mesh_eval_) {
-     BKE_id_free(nullptr, export_mesh_eval_);
-     export_mesh_eval_ = nullptr;
-     mesh_eval_needs_free_ = false;
+   if (owned_export_mesh_) {
+     BKE_id_free(nullptr, owned_export_mesh_);
    }
+   owned_export_mesh_ = mesh;
+   export_mesh_ = owned_export_mesh_;
+   mesh_positions_ = mesh->positions();
+   mesh_edges_ = mesh->edges();
+   mesh_polys_ = mesh->polys();
 -  mesh_loops_ = mesh->loops();
++  mesh_corner_verts_ = mesh->corner_verts();
  }
  
  void OBJMesh::clear()
@@@ -180,15 -189,12 +189,12 @@@ void OBJMesh::ensure_mesh_normals() con
  
  void OBJMesh::calc_smooth_groups(const bool use_bitflags)
  {
-   const Span<MEdge> edges = export_mesh_eval_->edges();
-   const Span<MPoly> polys = export_mesh_eval_->polys();
-   const Span<int> corner_edges = export_mesh_eval_->corner_edges();
-   poly_smooth_groups_ = BKE_mesh_calc_smoothgroups(edges.data(),
-                                                    edges.size(),
-                                                    polys.data(),
-                                                    polys.size(),
-                                                    corner_edges.data(),
-                                                    corner_edges.size(),
+   poly_smooth_groups_ = BKE_mesh_calc_smoothgroups(mesh_edges_.data(),
+                                                    mesh_edges_.size(),
+                                                    mesh_polys_.data(),
+                                                    mesh_polys_.size(),
 -                                                   mesh_loops_.data(),
 -                                                   mesh_loops_.size(),
++                                                   export_mesh_->corner_edges().data(),
++                                                   export_mesh_->totloop,
                                                     &tot_smooth_groups_,
                                                     use_bitflags);
  }
@@@ -269,16 -272,14 +272,8 @@@ float3 OBJMesh::calc_vertex_coords(cons
  
  Vector<int> OBJMesh::calc_poly_vertex_indices(const int poly_index) const
  {
-   const Span<MPoly> polys = export_mesh_eval_->polys();
-   const Span<MLoop> loops = export_mesh_eval_->loops();
-   const MPoly &mpoly = polys[poly_index];
-   const MLoop *mloop = &loops[mpoly.loopstart];
-   const int totloop = mpoly.totloop;
-   Vector<int> r_poly_vertex_indices(totloop);
-   for (int loop_index = 0; loop_index < totloop; loop_index++) {
-     r_poly_vertex_indices[loop_index] = mloop[loop_index].v;
-   }
-   return r_poly_vertex_indices;
+   const MPoly &mpoly = mesh_polys_[poly_index];
 -  const MLoop *mloop = &mesh_loops_[mpoly.loopstart];
 -  const int totloop = mpoly.totloop;
 -  Vector<int> r_poly_vertex_indices(totloop);
 -  for (int loop_index = 0; loop_index < totloop; loop_index++) {
 -    r_poly_vertex_indices[loop_index] = mloop[loop_index].v;
 -  }
 -  return r_poly_vertex_indices;
++  return mesh_corner_verts_.slice(mpoly.loopstart, mpoly.totloop);
  }
  
  void OBJMesh::store_uv_coords_and_indices()
@@@ -294,12 -293,12 +287,12 @@@
    }
    const float limit[2] = {STD_UV_CONNECT_LIMIT, STD_UV_CONNECT_LIMIT};
  
-   UvVertMap *uv_vert_map = BKE_mesh_uv_vert_map_create(polys.data(),
+   UvVertMap *uv_vert_map = BKE_mesh_uv_vert_map_create(mesh_polys_.data(),
                                                         nullptr,
                                                         nullptr,
-                                                        loops.data(),
 -                                                       mesh_loops_.data(),
++                                                       mesh_corner_verts_.data(),
                                                         mloopuv,
-                                                        polys.size(),
+                                                        mesh_polys_.size(),
                                                         totvert,
                                                         limit,
                                                         false,
@@@ -347,13 -346,10 +340,10 @@@ Span<int> OBJMesh::calc_poly_uv_indices
  float3 OBJMesh::calc_poly_normal(const int poly_index) const
  {
    float3 r_poly_normal;
-   const Span<float3> positions = export_mesh_eval_->positions();
-   const Span<MPoly> polys = export_mesh_eval_->polys();
-   const Span<MLoop> loops = export_mesh_eval_->loops();
-   const MPoly &poly = polys[poly_index];
+   const MPoly &poly = mesh_polys_[poly_index];
    BKE_mesh_calc_poly_normal(&poly,
-                             &loops[poly.loopstart],
-                             reinterpret_cast<const float(*)[3]>(positions.data()),
 -                            &mesh_loops_[poly.loopstart],
++                            &mesh_corner_verts_[poly.loopstart],
+                             reinterpret_cast<const float(*)[3]>(mesh_positions_.data()),
                              r_poly_normal);
    mul_m3_v3(world_and_axes_normal_transform_, r_poly_normal);
    normalize_v3(r_poly_normal);
@@@ -472,10 -463,10 +457,9 @@@ int16_t OBJMesh::get_poly_deform_group_
  
    group_weights.fill(0);
    bool found_any_group = false;
-   const MPoly &mpoly = polys[poly_index];
-   const MLoop *mloop = &loops[mpoly.loopstart];
-   for (int loop_i = 0; loop_i < mpoly.totloop; ++loop_i, ++mloop) {
-     const MDeformVert &dv = dverts[mloop->v];
+   const MPoly &mpoly = mesh_polys_[poly_index];
 -  const MLoop *mloop = &mesh_loops_[mpoly.loopstart];
 -  for (int loop_i = 0; loop_i < mpoly.totloop; ++loop_i, ++mloop) {
 -    const MDeformVert &dv = dverts[mloop->v];
++  for (const int vert_i : mesh_corner_verts_.slice(mpoly.loopstart, mpoly.totloop)) {
++    const MDeformVert &dv = dverts[vert_i];
      for (int weight_i = 0; weight_i < dv.totweight; ++weight_i) {
        const auto group = dv.dw[weight_i].def_nr;
        if (group < group_weights.size()) {
diff --cc source/blender/io/wavefront_obj/exporter/obj_export_mesh.hh
index f45dda338ee,5039a0388fb..403fce07c9b
--- a/source/blender/io/wavefront_obj/exporter/obj_export_mesh.hh
+++ b/source/blender/io/wavefront_obj/exporter/obj_export_mesh.hh
@@@ -35,11 -35,15 +35,15 @@@ class OBJMesh : NonCopyable 
     * sometimes builds an Object in a temporary space that doesn't persist.
     */
    Object export_object_eval_;
-   Mesh *export_mesh_eval_;
-   /**
-    * For curves which are converted to mesh, and triangulated meshes, a new mesh is allocated.
-    */
-   bool mesh_eval_needs_free_ = false;
+   /** A pointer to #owned_export_mesh_ or the object'ed evaluated/original mesh. */
+   const Mesh *export_mesh_;
+   /** A mesh owned here, if created or modified for the export. May be null. */
+   Mesh *owned_export_mesh_ = nullptr;
+   Span<float3> mesh_positions_;
+   Span<MEdge> mesh_edges_;
+   Span<MPoly> mesh_polys_;
 -  Span<MLoop> mesh_loops_;
++  Span<int> mesh_corner_verts_;
+ 
    /**
     * Final transform of an object obtained from export settings (up_axis, forward_axis) and the
     * object's world transform matrix.



More information about the Bf-blender-cvs mailing list