Fix T49369: Blender crashes/closes down application at alembic export of
authorKévin Dietrich <kevin.dietrich@mailoo.org>
Fri, 16 Sep 2016 07:27:44 +0000 (09:27 +0200)
committerKévin Dietrich <kevin.dietrich@mailoo.org>
Fri, 16 Sep 2016 07:27:44 +0000 (09:27 +0200)
any object

There were a couple of crashes caused by stupid typos in
rB631af9f930d2fd2c76751204ff22239aa95f761d and
rB78ea06fea4a74181c25254ed72d50d8a743b6954, as well as a shamefull lack
of 'testing before committing' which only affect exporting.

One crash was due to using RNA_boolean_get instead of RNA_enum_get, the
other one was a tricky case of order of deletion happening in the
destructors of AbcExporter and ArchiveWriter.

Should not affect RC or release.

source/blender/alembic/intern/abc_archive.cc
source/blender/alembic/intern/abc_archive.h
source/blender/alembic/intern/abc_exporter.cc
source/blender/alembic/intern/abc_exporter.h
source/blender/editors/io/io_alembic.c

index 72c0a2294af354a0685aa8d01699688a2a68cda7..0985a06d732fe559bd3f883e5f7139c03e6c5d1f 100644 (file)
@@ -169,7 +169,7 @@ ArchiveWriter::ArchiveWriter(const char *filename, const char *scene, bool do_og
                                   do_ogawa);
 }
 
-OArchive ArchiveWriter::archive()
+OArchive &ArchiveWriter::archive()
 {
        return m_archive;
 }
index 68d7a5ca70dbd9a57fd475a86adf31eff6209b67..d412574b73651717f18b51709b95136d2fe32323 100644 (file)
@@ -54,13 +54,13 @@ public:
 };
 
 class ArchiveWriter {
-       Alembic::Abc::OArchive m_archive;
        std::ofstream m_outfile;
+       Alembic::Abc::OArchive m_archive;
 
 public:
        explicit ArchiveWriter(const char *filename, const char *scene, bool do_ogawa, Alembic::Abc::MetaData &md);
 
-       Alembic::Abc::OArchive archive();
+       Alembic::Abc::OArchive &archive();
 };
 
 #endif /* __ABC_ARCHIVE_H__ */
index 50949624db203e17c54a14d675a559ce886ece15..a31122b7cd01e06da9134f3e5783c9c3048437e7 100644 (file)
@@ -148,6 +148,7 @@ AbcExporter::AbcExporter(Scene *scene, const char *filename, ExportSettings &set
     , m_trans_sampling_index(0)
     , m_shape_sampling_index(0)
     , m_scene(scene)
+    , m_writer(NULL)
 {}
 
 AbcExporter::~AbcExporter()
@@ -160,6 +161,8 @@ AbcExporter::~AbcExporter()
        for (int i = 0, e = m_shapes.size(); i != e; ++i) {
                delete m_shapes[i];
        }
+
+       delete m_writer;
 }
 
 void AbcExporter::getShutterSamples(double step, bool time_relative,
@@ -243,14 +246,13 @@ void AbcExporter::operator()(Main *bmain, float &progress, bool &was_canceled)
        Alembic::AbcCoreAbstract::MetaData md;
        md.set("FramesPerTimeUnit", str_fps);
 
-       ArchiveWriter writer(m_filename, scene_name.c_str(), m_settings.export_ogawa, md);
-       m_archive = writer.archive();
+       m_writer = new ArchiveWriter(m_filename, scene_name.c_str(), m_settings.export_ogawa, md);
 
        /* Create time samplings for transforms and shapes. */
 
        TimeSamplingPtr trans_time = createTimeSampling(m_settings.frame_step_xform);
 
-       m_trans_sampling_index = m_archive.addTimeSampling(*trans_time);
+       m_trans_sampling_index = m_writer->archive().addTimeSampling(*trans_time);
 
        TimeSamplingPtr shape_time;
 
@@ -262,10 +264,10 @@ void AbcExporter::operator()(Main *bmain, float &progress, bool &was_canceled)
        }
        else {
                shape_time = createTimeSampling(m_settings.frame_step_shape);
-               m_shape_sampling_index = m_archive.addTimeSampling(*shape_time);
+               m_shape_sampling_index = m_writer->archive().addTimeSampling(*shape_time);
        }
 
-       OBox3dProperty archive_bounds_prop = Alembic::AbcGeom::CreateOArchiveBounds(m_archive, m_trans_sampling_index);
+       OBox3dProperty archive_bounds_prop = Alembic::AbcGeom::CreateOArchiveBounds(m_writer->archive(), m_trans_sampling_index);
 
        if (m_settings.flatten_hierarchy) {
                createTransformWritersFlat();
@@ -371,7 +373,7 @@ void AbcExporter::createTransformWritersFlat()
 
                if (export_object(&m_settings, ob) && object_is_shape(ob)) {
                        std::string name = get_id_name(ob);
-                       m_xforms[name] = new AbcTransformWriter(ob, m_archive.getTop(), 0, m_trans_sampling_index, m_settings);
+                       m_xforms[name] = new AbcTransformWriter(ob, m_writer->archive().getTop(), 0, m_trans_sampling_index, m_settings);
                }
 
                base = base->next;
@@ -437,7 +439,7 @@ void AbcExporter::createTransformWriter(Object *ob, Object *parent, Object *dupl
                m_xforms[name]->setParent(parent);
        }
        else {
-               m_xforms[name] = new AbcTransformWriter(ob, m_archive.getTop(), NULL, m_trans_sampling_index, m_settings);
+               m_xforms[name] = new AbcTransformWriter(ob, m_writer->archive().getTop(), NULL, m_trans_sampling_index, m_settings);
        }
 }
 
index b99eb09c788a648c33002b52d7638ead2985f16a..b0eb8e185d6766b3682e82e3cf22a1839bb28c93 100644 (file)
@@ -30,6 +30,7 @@
 
 class AbcObjectWriter;
 class AbcTransformWriter;
+class ArchiveWriter;
 
 struct EvaluationContext;
 struct Main;
@@ -79,11 +80,12 @@ class AbcExporter {
 
        const char *m_filename;
 
-       Alembic::Abc::OArchive m_archive;
        unsigned int m_trans_sampling_index, m_shape_sampling_index;
 
        Scene *m_scene;
 
+       ArchiveWriter *m_writer;
+
        std::map<std::string, AbcTransformWriter *> m_xforms;
        std::vector<AbcObjectWriter *> m_shapes;
 
index 61ad8549c6c48c37c1eaf2fb9689cfa93cb070f2..2256bd7f8c58ef835fc27afbe959f0d13d731e00 100644 (file)
@@ -123,8 +123,8 @@ static int wm_alembic_export_exec(bContext *C, wmOperator *op)
            .compression_type = RNA_enum_get(op->ptr, "compression_type"),
            .packuv = RNA_boolean_get(op->ptr, "packuv"),
                .triangulate = RNA_boolean_get(op->ptr, "triangulate"),
-               .quad_method = RNA_boolean_get(op->ptr, "quad_method"),
-               .ngon_method = RNA_boolean_get(op->ptr, "ngon_method"),
+               .quad_method = RNA_enum_get(op->ptr, "quad_method"),
+               .ngon_method = RNA_enum_get(op->ptr, "ngon_method"),
 
            .global_scale = RNA_float_get(op->ptr, "global_scale"),
        };