Commit: 04bfea0d6747b48cf8e792586cd6df8df0f00dcc Author: Kévin Dietrich Date: Fri Sep 16 09:27:44 2016 +0200 Branches: master https://developer.blender.org/rB04bfea0d6747b48cf8e792586cd6df8df0f00dcc
Fix T49369: Blender crashes/closes down application at alembic export of 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. =================================================================== M source/blender/alembic/intern/abc_archive.cc M source/blender/alembic/intern/abc_archive.h M source/blender/alembic/intern/abc_exporter.cc M source/blender/alembic/intern/abc_exporter.h M source/blender/editors/io/io_alembic.c =================================================================== diff --git a/source/blender/alembic/intern/abc_archive.cc b/source/blender/alembic/intern/abc_archive.cc index 72c0a22..0985a06 100644 --- a/source/blender/alembic/intern/abc_archive.cc +++ b/source/blender/alembic/intern/abc_archive.cc @@ -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; } diff --git a/source/blender/alembic/intern/abc_archive.h b/source/blender/alembic/intern/abc_archive.h index 68d7a5c..d412574 100644 --- a/source/blender/alembic/intern/abc_archive.h +++ b/source/blender/alembic/intern/abc_archive.h @@ -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__ */ diff --git a/source/blender/alembic/intern/abc_exporter.cc b/source/blender/alembic/intern/abc_exporter.cc index 5094962..a31122b 100644 --- a/source/blender/alembic/intern/abc_exporter.cc +++ b/source/blender/alembic/intern/abc_exporter.cc @@ -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); } } diff --git a/source/blender/alembic/intern/abc_exporter.h b/source/blender/alembic/intern/abc_exporter.h index b99eb09..b0eb8e1 100644 --- a/source/blender/alembic/intern/abc_exporter.h +++ b/source/blender/alembic/intern/abc_exporter.h @@ -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; diff --git a/source/blender/editors/io/io_alembic.c b/source/blender/editors/io/io_alembic.c index 61ad854..2256bd7 100644 --- a/source/blender/editors/io/io_alembic.c +++ b/source/blender/editors/io/io_alembic.c @@ -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"), }; _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs