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.
This commit is contained in:
parent
e156abe467
commit
04bfea0d67
Notes:
blender-bot
2023-02-14 11:21:43 +01:00
Referenced by issue #49369, Blender crashes/closes down application at alembic export of any object
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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"),
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue