Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKévin Dietrich <kevin.dietrich@mailoo.org>2016-09-16 10:27:44 +0300
committerKévin Dietrich <kevin.dietrich@mailoo.org>2016-09-16 10:27:44 +0300
commit04bfea0d6747b48cf8e792586cd6df8df0f00dcc (patch)
treef4426f36cbc17bfe92e2c74b37969604eb3b6e1e /source/blender/alembic
parente156abe467bc0e69ffcf1c298ac1d984762ebc8e (diff)
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.
Diffstat (limited to 'source/blender/alembic')
-rw-r--r--source/blender/alembic/intern/abc_archive.cc2
-rw-r--r--source/blender/alembic/intern/abc_archive.h4
-rw-r--r--source/blender/alembic/intern/abc_exporter.cc16
-rw-r--r--source/blender/alembic/intern/abc_exporter.h4
4 files changed, 15 insertions, 11 deletions
diff --git a/source/blender/alembic/intern/abc_archive.cc b/source/blender/alembic/intern/abc_archive.cc
index 72c0a2294af..0985a06d732 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 68d7a5ca70d..d412574b736 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 50949624db2..a31122b7cd0 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 b99eb09c788..b0eb8e185d6 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;