[Bf-blender-cvs] [aff190c14a3] soc-2019-fast-io: [Fast import/export] Refactoring, using DEG_OBJECT_ITER, fixed crash when UVs don't exist for object, fixed applying scale and axis remap

Hugo Sales noreply at git.blender.org
Fri Jun 28 15:47:24 CEST 2019


Commit: aff190c14a3ffdf3d50ddc62ad5ad52845225a59
Author: Hugo Sales
Date:   Fri Jun 28 14:45:27 2019 +0100
Branches: soc-2019-fast-io
https://developer.blender.org/rBaff190c14a3ffdf3d50ddc62ad5ad52845225a59

[Fast import/export] Refactoring, using DEG_OBJECT_ITER, fixed crash when UVs don't exist for object, fixed applying scale and axis remap

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

M	source/blender/depsgraph/DEG_depsgraph_query.h
M	source/blender/editors/io/intern/common.cpp
M	source/blender/editors/io/intern/common.hpp
M	source/blender/editors/io/intern/iterators.hpp
M	source/blender/editors/io/intern/obj.cpp
M	source/blender/editors/io/intern/stl.cpp
M	source/blender/editors/io/io_common.c
M	source/blender/editors/io/io_common.h
M	source/blender/editors/io/io_obj.c
M	source/blender/editors/io/io_stl.c

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

diff --git a/source/blender/depsgraph/DEG_depsgraph_query.h b/source/blender/depsgraph/DEG_depsgraph_query.h
index 4148529d3f8..e612a58c410 100644
--- a/source/blender/depsgraph/DEG_depsgraph_query.h
+++ b/source/blender/depsgraph/DEG_depsgraph_query.h
@@ -26,6 +26,8 @@
 #ifndef __DEG_DEPSGRAPH_QUERY_H__
 #define __DEG_DEPSGRAPH_QUERY_H__
 
+#include "BLI_iterator.h"
+
 #include "DEG_depsgraph.h"
 #include "DEG_depsgraph_build.h"
 
diff --git a/source/blender/editors/io/intern/common.cpp b/source/blender/editors/io/intern/common.cpp
index 0b19bfd9912..98c2602b005 100644
--- a/source/blender/editors/io/intern/common.cpp
+++ b/source/blender/editors/io/intern/common.cpp
@@ -106,11 +106,9 @@ bool should_export_object(const ExportSettings *const settings, const Object *co
     /* These tests only make sense when the object isn't being instanced
      * into the scene. When it is, its exportability is determined by
      * its dupli-object and the DupliObject::no_draw property. */
-    return (settings->selected_only && (ob->flag & BASE_SELECTED) != 0) ||
-           // FIXME Sybren: handle these cleanly (maybe just remove code),
-           // now using active scene layer instead.
-           (settings->visible_only && (ob->flag & BASE_VISIBLE) != 0) ||
-           (settings->renderable_only && (ob->flag & BASE_ENABLED_RENDER) != 0);
+    return (settings->selected_only ? ((ob->base_flag & BASE_SELECTED) != 0) : true) &&
+           (settings->visible_only ? ((ob->base_flag & BASE_VISIBLE) != 0) : true) &&
+           (settings->renderable_only ? ((ob->base_flag & BASE_ENABLED_RENDER) != 0) : true);
   }
   else if (!(ob->parent != NULL && ob->parent->transflag & OB_DUPLI))
     return should_export_object(settings, ob->parent);
@@ -161,45 +159,25 @@ float get_unit_scale(const Scene *const scene)
 
 bool get_final_mesh(const ExportSettings *const settings,
                     const Scene *const escene,
-                    const Object *ob,
-                    Mesh **mesh /* out */)
+                    const Object *eob,
+                    Mesh **mesh /* out */,
+                    float (*mat)[4][4] /* out */)
 {
-  /* Based on abc_mesh.cc */
+  scale_m4_fl(*mat, settings->global_scale * get_unit_scale(escene));
 
-  /* Temporarily disable modifiers if we shouldn't apply them */
-  if (!settings->apply_modifiers)
-    for (ModifierData &md : common::modifier_iter{ob})
-      md.mode |= eModifierMode_DisableTemporary;
-
-  float scale_mat[4][4];
-  scale_m4_fl(scale_mat, settings->global_scale * get_unit_scale(escene));
-
-  change_orientation(scale_mat, settings->axis_forward, settings->axis_up);
+  change_orientation(*mat, settings->axis_forward, settings->axis_up);
 
   // TODO someone Unsure if necessary
-  // scale_mat[3][3] = m_settings.global_scale;  /* also scale translation */
+  // mat[3][3] = m_settings.global_scale;  /* also scale translation */
 
   // TODO someone Doesn't seem to do anyhing. Is it necessary to update the object somehow?
-  mul_m4_m4m4((float(*)[4])ob->obmat, ob->obmat, scale_mat);
+  // mul_m4_m4m4((float(*)[4])eob->obmat, eob->obmat, mat);
   // yup_mat[3][3] /= m_settings.global_scale;  /* normalise the homogeneous component */
 
-  if (determinant_m4(ob->obmat) < 0.0)
+  if (determinant_m4(*mat) < 0.0)
     ; /* TODO someone flip normals */
 
-  /* Object *ob = DEG_get_evaluated_object(settings->depsgraph, ob); */
-  // *mesh = mesh_get_eval_final(settings->depsgraph, (Scene *) escene,
-  //                             (Object *) ob, &CD_MASK_MESH);
-
-  if (settings->render_modifiers)  // vv Depends on depsgraph type
-    *mesh = mesh_create_eval_final_render(
-        settings->depsgraph, (Scene *)escene, (Object *)ob, &CD_MASK_MESH);
-  else
-    *mesh = mesh_create_eval_final_view(
-        settings->depsgraph, (Scene *)escene, (Object *)ob, &CD_MASK_MESH);
-
-  if (!settings->apply_modifiers)
-    for (ModifierData &md : common::modifier_iter{ob})
-      md.mode &= ~eModifierMode_DisableTemporary;
+  *mesh = eob->runtime.mesh_eval;
 
   if (settings->triangulate) {
     struct BMeshCreateParams bmcp = {false};
@@ -245,6 +223,11 @@ void export_start(bContext *UNUSED(C), ExportSettings *const settings)
    */
   G.is_rendering = true;  // TODO someone Should use BKE_main_lock(bmain);?
   BKE_spacedata_draw_locks(true);
+  // If render_modifiers use render depsgraph, to get render modifiers
+  settings->depsgraph = DEG_graph_new(settings->scene,
+                                      settings->view_layer,
+                                      settings->render_modifiers ? DAG_EVAL_RENDER :
+                                                                   DAG_EVAL_VIEWPORT);
   DEG_graph_build_from_view_layer(
       settings->depsgraph, settings->main, settings->scene, settings->view_layer);
   BKE_scene_graph_update_tagged(settings->depsgraph, settings->main);
@@ -259,7 +242,6 @@ bool export_end(bContext *UNUSED(C), ExportSettings *const settings)
   return true;
 }
 
-/* clang-format off */
 bool time_export(bContext *C,
                  ExportSettings *const settings,
                  void (*start)(bContext *C, ExportSettings *const settings),
@@ -269,11 +251,12 @@ bool time_export(bContext *C,
   start(C, settings);
   auto ret = end(C, settings);
   std::cout << "Took "
-            << std::chrono::duration_cast<std::chrono::milliseconds>
-               (std::chrono::steady_clock::now() - f).count() << "ms\n";
+            << std::chrono::duration_cast<std::chrono::milliseconds>(
+                   std::chrono::steady_clock::now() - f)
+                   .count()
+            << "ms\n";
   return ret;
 }
-/* clang-format on */
 
 const std::array<float, 3> calculate_normal(const Mesh *const mesh, const MPoly &mp)
 {
diff --git a/source/blender/editors/io/intern/common.hpp b/source/blender/editors/io/intern/common.hpp
index cfc4a625d91..fcaad8fbf67 100644
--- a/source/blender/editors/io/intern/common.hpp
+++ b/source/blender/editors/io/intern/common.hpp
@@ -69,8 +69,9 @@ void change_orientation(float (&mat)[4][4], int forward, int up);
 
 bool get_final_mesh(const ExportSettings *const settings,
                     const Scene *const escene,
-                    const Object *ob,
-                    Mesh **mesh /* out */);
+                    const Object *eob,
+                    Mesh **mesh /* out */,
+                    float (*mat)[4][4] /* out */);
 
 void free_mesh(Mesh *mesh, bool needs_free);
 
diff --git a/source/blender/editors/io/intern/iterators.hpp b/source/blender/editors/io/intern/iterators.hpp
index 60ec3752f23..c3bc3bf9f29 100644
--- a/source/blender/editors/io/intern/iterators.hpp
+++ b/source/blender/editors/io/intern/iterators.hpp
@@ -108,6 +108,22 @@ struct vert_iter : pointer_iterator<MVert> {
   vert_iter(const Mesh *const m) : pointer_iterator(m->mvert, m->totvert) {}
 };
 
+struct transformed_vertex_iter : pointer_iterator_base<MVert> {
+  using Mat = const float(*)[4]; // Must actually be float[4][4]
+  transformed_vertex_iter(const Mesh *const m, Mat &mat)
+    : pointer_iterator_base(m->mvert, m->totvert), mat(mat) {}
+  transformed_vertex_iter(MVert * const mvert, size_t size, Mat &mat)
+    : pointer_iterator_base(mvert, size), mat(mat) {}
+  transformed_vertex_iter begin() const { return {this->first,  this->size, mat}; }
+  transformed_vertex_iter end()   const { return {this->first + this->size, this->size, mat}; }
+  const std::array<float, 3> operator*() const {
+    float co[3];
+    mul_v3_m4v3(co, mat, this->curr->co);
+    return {co[0], co[1], co[2]};
+  }
+  Mat &mat;
+};
+
 // Iterator over the vertices of a polygon
 struct vert_of_poly_iter : pointer_iterator_base<MLoop, std::random_access_iterator_tag> {
   // TODO someone What order are the vertices stored in? Clockwise?
@@ -238,8 +254,8 @@ struct points_of_nurbs_iter : pointer_iterator_base<BPoint> {
 
 // Iterator over the UVs of a mesh (as `const std::array<float, 2>`)
 struct uv_iter : pointer_iterator_base<MLoopUV> {
-  uv_iter(const Mesh *const m) : pointer_iterator_base(m->mloopuv, m->totloop) {}
-  uv_iter(MLoopUV * const uv, size_t size) : pointer_iterator_base(uv, size) {}
+  uv_iter(const Mesh *const m) : pointer_iterator_base(m->mloopuv, m->mloopuv ? m->totloop : 0) {}
+  uv_iter(MLoopUV * const uv, size_t size) : pointer_iterator_base(uv, uv ? size : 0) {}
   uv_iter begin() const { return {this->first, this->size}; }
   uv_iter end()   const { return {this->first + this->size, this->size}; }
   inline const std::array<float, 2> operator*() {
@@ -365,9 +381,11 @@ struct deduplicated_iterator {
     // Reserve space so we don't constantly allocate
     dedup_pair.second.reserve(reserve);
     // Need to insert the first element, because we need to dereference before incrementing
-    auto p = dedup_pair.first.insert(std::make_pair(*this->it, total++));
-    dedup_pair.second.push_back(p.first);
-    ++this->it;
+    if (this->it != this->it.end()) {
+      auto p = dedup_pair.first.insert(std::make_pair(*this->it, total++));
+      dedup_pair.second.push_back(p.first);
+      ++this->it;
+    }
   }
   deduplicated_iterator begin() const {
     return deduplicated_iterator(mesh, dedup_pair, total, it.begin());
diff --git a/source/blender/editors/io/intern/obj.cpp b/source/blender/editors/io/intern/obj.cpp
index 598d8eba8c4..053c485d9cb 100644
--- a/source/blender/editors/io/intern/obj.cpp
+++ b/source/blender/editors/io/intern/obj.cpp
@@ -12,15 +12,17 @@ extern "C" {
 #include "BKE_library.h"
 #include "BKE_customdata.h"
 
+#include "DNA_curve_types.h"
 #include "DNA_ID.h"
+#include "DNA_layer_types.h"
 #include "DNA_material_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_object_types.h"
 #include "DNA_space_types.h"
-#include "DNA_curve_types.h"
 
 #include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
 
 #include "WM_api.h"
 #include "WM_types.h"
@@ -144,7 +146,8 @@ bool OBJ_export_materials(bContext *C,
 
     ss << (mat->id.name + 2) << '"';
   }
-  ss << "], '" << path_reference_mode[((OBJExportSettings *)settings->extra)->path_mode].identifier
+  ss << "], '"
+     << path_reference_mode[((OBJExportSettings *)settings->format_specific)

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list