Commit: b8a84a0402dae320668b1db13cf8fc3aa827e209
Author: Hugo Sales
Date:   Thu Jun 6 21:39:15 2019 +0100
Branches: soc-2019-fast-io
https://developer.blender.org/rBb8a84a0402dae320668b1db13cf8fc3aa827e209

[Fast import/export] Refactoring, fixed ASCII STL export and other bugs

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

M       source/blender/editors/io/intern/common.cpp
M       source/blender/editors/io/intern/common.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/editors/io/intern/common.cpp 
b/source/blender/editors/io/intern/common.cpp
index 570694f3e4a..fe7ce15712f 100644
--- a/source/blender/editors/io/intern/common.cpp
+++ b/source/blender/editors/io/intern/common.cpp
@@ -8,6 +8,7 @@ extern "C" {
 #include "DNA_object_types.h"
 #include "DNA_modifier_types.h"
 
+#include "BKE_modifier.h"
 #include "BKE_modifier.h"
 #include "BKE_mesh.h"
 #include "BKE_mesh_runtime.h"
@@ -70,44 +71,41 @@ namespace common {
                return false;
        }
 
-       /**
-        * Returns whether this object should be exported into the Alembic file.
-        *
-        * \param settings: export settings, used for options like 'selected 
only'.
-        * \param ob: the object's base in question.
-        * This ignores layer visibility,
-        * and assumes that the dupli-object itself (e.g. the 
group-instantiating empty) is exported.
-        */
-       bool should_export_object(const ExportSettings * const settings, const 
Object * const eob) {
-               // If the object is a dupli, it's export satus depends on the 
parent
-               if (!(eob->flag & BASE_FROM_DUPLI)) {
-                       /* !(eob->parent != NULL && eob->parent->transflag & 
OB_DUPLI) */
-
-                       /* 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 && (eob->flag & 
BASE_SELECTED) != 0) ||
-                               // FIXME Sybren: handle these cleanly (maybe 
just remove code),
-                               // now using active scene layer instead.
-                               (settings->visible_only && (eob->flag & 
BASE_VISIBLE) != 0) ||
-                               (settings->renderable_only && (eob->flag & 
BASE_ENABLED_RENDER) != 0);
-               }
-
-               return should_export_object(settings, eob->parent);
-       }
-
-
        bool object_type_is_exportable(const Object * const ob) {
                switch (ob->type) {
                case OB_MESH:
                        return !object_is_smoke_sim(ob);
-                       /* case OB_EMPTY: */
                        /* case OB_CURVE: */
                        /* case OB_SURF: */
-                       /* case OB_CAMERA: */
-                       /* return false; */
+               case OB_LAMP:
+               case OB_EMPTY:
+               case OB_CAMERA:
+                       return false;
                default:
-                       printf("Export for this object type is not defined 
%s\n", ob->id.name);
+                       // TODO someone Print in debug only
+                       fprintf(stderr, "Export for this object type is not yet 
defined %s\n", ob->id.name);
+                       return false;
+               }
+       }
+
+       // Whether the object should be exported
+       bool should_export_object(const ExportSettings * const settings, const 
Object * const ob) {
+               if (!object_type_is_exportable(ob))
+                       return false;
+               // If the object is a dupli, it's export satus depends on the 
parent
+               if (!(ob->flag & BASE_FROM_DUPLI)) {
+                       /* 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);
+               } else if (!(ob->parent != NULL && ob->parent->transflag & 
OB_DUPLI))
+                       return should_export_object(settings, ob->parent);
+               else {
+                       BLI_assert(!"should_export_object");
                        return false;
                }
        }
diff --git a/source/blender/editors/io/intern/common.hpp 
b/source/blender/editors/io/intern/common.hpp
index 99d22e8d86e..a74eb4a8368 100644
--- a/source/blender/editors/io/intern/common.hpp
+++ b/source/blender/editors/io/intern/common.hpp
@@ -63,10 +63,10 @@ namespace common {
 
        bool object_is_smoke_sim(const Object * const ob);
 
-       bool should_export_object(const ExportSettings * const settings, const 
Object * const eob);
-
        bool object_type_is_exportable(const Object * const ob);
 
+       bool should_export_object(const ExportSettings * const settings, const 
Object * const ob);
+
        void change_orientation(float (&mat)[4][4], int forward, int up);
 
        bool get_final_mesh(const ExportSettings * const settings, const Scene 
* const escene,
@@ -97,7 +97,7 @@ namespace common {
        template<typename SourceT, typename Tag = 
std::random_access_iterator_tag>
        struct pointer_iterator :
                public boost::iterator_facade<pointer_iterator<SourceT, Tag>, 
SourceT &, Tag> {
-               pointer_iterator() = default;
+               pointer_iterator() : first(nullptr) {}
                pointer_iterator(const pointer_iterator<SourceT, Tag> &) = 
default;
                pointer_iterator(pointer_iterator<SourceT, Tag> &&) = default;
                explicit pointer_iterator(SourceT *p) : it(p), first(p), 
size(0) {}
@@ -166,7 +166,7 @@ namespace common {
                 typename Tag = std::bidirectional_iterator_tag>
        struct list_iterator : public 
boost::iterator_adaptor<list_iterator<SourceT, ResT, Tag>,
                                                              
pointer_iterator<SourceT, Tag>, ResT, Tag, ResT> {
-               list_iterator() : list_iterator::iterator_adaptor_() {}
+               list_iterator() : list_iterator::iterator_adaptor_(), 
first(nullptr) {}
                list_iterator(const pointer_iterator<SourceT, Tag> &other)
                        : list_iterator::iterator_adaptor_(other), 
first(other.first) {}
                explicit list_iterator(SourceT *first)
@@ -203,19 +203,6 @@ namespace common {
                const Mesh * const mesh;
        };
 
-       // Iterator over the UVs of a mesh (as `const std::array<float, 2>`)
-       struct uv_iter : public dereference_iterator<MLoopUV, const 
std::array<float, 2>, uv_iter> {
-               explicit uv_iter(const Mesh * const m)
-                       : dereference_iterator(m->mloopuv, m->totloop, this) {}
-               uv_iter(const dereference_iterator_ &di)
-                       : dereference_iterator(di, this) {}
-               uv_iter(dereference_iterator_ &&di)
-                       : dereference_iterator(di, this) {}
-               inline const std::array<float, 2> dereference(const 
pointer_iterator<MLoopUV> &b) {
-                       return {b->uv[0], b->uv[1]};
-               }
-       };
-
        // Iterator over all the edges of a mesh
        struct edge_iter : pointer_iterator<MEdge> {
                edge_iter(const Mesh * const m) : pointer_iterator(m->medge, 
m->totedge) {}
@@ -247,18 +234,47 @@ namespace common {
        // Iterator over all the objects in a `ViewLayer`
        // TODO someone G.is_break
        struct object_iter : dereference_iterator<Base, Object *, object_iter, 
list_iterator<Base>> {
-               explicit object_iter(const ViewLayer * const vl)
+               object_iter(const ViewLayer * const vl)
                        : dereference_iterator((Base *) vl->object_bases.first, 
this) {}
+               object_iter(Base *b)
+                       : dereference_iterator(b, this) {}
                inline static Object * dereference(const list_iterator<Base> 
&b) { return b->object; }
        };
 
+       struct exportable_object_iter
+               : public boost::iterator_adaptor<exportable_object_iter, 
object_iter> {
+               explicit exportable_object_iter(const ExportSettings * const 
settings)
+                       : 
exportable_object_iter::iterator_adaptor_(settings->view_layer),
+                         settings(settings) {}
+               exportable_object_iter(const ExportSettings * const settings, 
Base *base)
+                       : exportable_object_iter::iterator_adaptor_(base),
+                         settings(settings) {}
+               friend class boost::iterator_core_access;
+               exportable_object_iter begin() const { return { settings, (Base 
*) settings->view_layer->
+                                                                               
   object_bases.first}; }
+               exportable_object_iter end()   const { return { settings, (Base 
*) nullptr}; }
+               void increment() {
+                       do {
+                               ++this->base_reference();
+                       } while (this->base() != this->base().end() &&
+                                !should_export_object(settings, 
*this->base()));
+               }
+               void decrement() {
+                       do {
+                               --this->base_reference();
+                       } while (this->base() != this->base().begin() &&
+                                !should_export_object(settings, 
*this->base()));
+               }
+               const ExportSettings * const settings;
+       };
+
        // Iterator over the modifiers of an `Object`
        struct modifier_iter : list_iterator<ModifierData> {
                explicit modifier_iter(const Object * const ob)
                        : list_iterator((ModifierData *) ob->modifiers.first) {}
        };
 
-       // Iterator over the `MLoop` if a `MPoly` of a mesh
+       // Iterator over the `MLoop` of a `MPoly` of a mesh
        struct loop_of_poly_iter : pointer_iterator<MLoop> {
                explicit loop_of_poly_iter(const Mesh * const mesh, const 
poly_iter &poly)
                        : pointer_iterator(mesh->mloop + poly->loopstart, 
poly->totloop - 1) {}
@@ -268,6 +284,19 @@ namespace common {
                loop_of_poly_iter(pointer_iterator &&p) : 
pointer_iterator(std::move(p)) {}
        };
 
+       // Iterator over the UVs of a mesh (as `const std::array<float, 2>`)
+       struct uv_iter : public dereference_iterator<MLoopUV, const 
std::array<float, 2>, uv_iter> {
+               explicit uv_iter(const Mesh * const m)
+                       : dereference_iterator(m->mloopuv, m->totloop, this) {}
+               uv_iter(const dereference_iterator_ &di)
+                       : dereference_iterator(di, this) {}
+               uv_iter(dereference_iterator_ &&di)
+                       : dereference_iterator(di, this) {}
+               inline const std::array<float, 2> dereference(const 
pointer_iterator<MLoopUV> &b) {
+                       return {b->uv[0], b->uv[1]};
+               }
+       };
+
        // Iterator over the normals of mesh
        // This is a more complex one, because there are three possible sources 
for the normals of a mesh:
        //   - Custom normals
diff --git a/source/blender/editors/io/intern/obj.cpp 
b/source/blender/editors/io/intern/obj.cpp
index c0f2cc2f278..65a2d8dde7d 100644
--- a/source/blender/editors/io/intern/obj.cpp
+++ b/source/blender/editors/io/intern/obj.cpp
@@ -232,9 +232,9 @@ namespace {
                               dedup_pair_t<uv_key_t> &uv_mapping_pair, 
dedup_pair_t<no_key_t> &no_mapping_pair) {
                // TODO someone Should it be evaluated first? Is this 
expensive? Breaks mesh_create_eval_final
                // Object *eob = DEG_get_evaluated_object(settings->depsgraph, 
base->object);
-               if (!common::should_export_object(settings, ob) ||
-                   !common::object_type_is_exportable(ob))
-                       return false;
+               // if (!common::should_export_object(settings, ob) ||
+               //     !common::object_type_is_exportable(ob))
+               //      return false;
 
                struct Mesh *mesh = nullptr;
                bool needs_free = false;
@@ -252,8 +252,9 @@ namespace {
                        return true;
                default:
                        // TODO someone Probably abort, it shouldn't be 
possible to get here
-                       std::cerr << "OBJ Export for this Object Type not 
implemented"
-                                 << ob->id.name << '\

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to