[Bf-blender-cvs] [fbe625c] alembic_basic_io: Avoid using G.main.
Kévin Dietrich
noreply at git.blender.org
Thu Jun 9 14:11:59 CEST 2016
Commit: fbe625c2f70c151e0756606832d71393f1c368c2
Author: Kévin Dietrich
Date: Thu Jun 9 12:20:40 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rBfbe625c2f70c151e0756606832d71393f1c368c2
Avoid using G.main.
===================================================================
M source/blender/alembic/intern/abc_exporter.cc
M source/blender/alembic/intern/abc_exporter.h
M source/blender/alembic/intern/alembic_capi.cc
===================================================================
diff --git a/source/blender/alembic/intern/abc_exporter.cc b/source/blender/alembic/intern/abc_exporter.cc
index 75ac85e..d338511 100644
--- a/source/blender/alembic/intern/abc_exporter.cc
+++ b/source/blender/alembic/intern/abc_exporter.cc
@@ -65,7 +65,6 @@ AbcExporter::AbcExporter(Scene *scene, const char *filename, ExportSettings &set
: m_settings(settings)
, m_filename(filename)
, m_scene(scene)
- , m_saved_frame(getCurrentFrame())
{}
AbcExporter::~AbcExporter()
@@ -76,10 +75,6 @@ AbcExporter::~AbcExporter()
for (int i = 0, e = m_shapes.size(); i != e; ++i) {
delete m_shapes[i];
}
-
- if (getCurrentFrame() != m_saved_frame) {
- setCurrentFrame(m_saved_frame);
- }
}
void AbcExporter::getShutterSamples(double step, bool time_relative,
@@ -141,15 +136,15 @@ void AbcExporter::getFrameSet(double step, std::set<double> &frames)
}
}
-void AbcExporter::operator()(float &progress)
+void AbcExporter::operator()(Main *bmain, float &progress)
{
/* Create archive here */
std::string scene_name;
- if (G.main->name[0] != '\0') {
- char sceneFileName[FILE_MAX];
- BLI_strncpy(sceneFileName, G.main->name, FILE_MAX);
- scene_name = sceneFileName;
+ if (bmain->name[0] != '\0') {
+ char scene_file_name[FILE_MAX];
+ BLI_strncpy(scene_file_name, bmain->name, FILE_MAX);
+ scene_name = scene_file_name;
}
else {
scene_name = "untitled";
@@ -199,10 +194,10 @@ void AbcExporter::operator()(float &progress)
createTransformWritersFlat();
}
else {
- createTransformWritersHierarchy();
+ createTransformWritersHierarchy(bmain->eval_ctx);
}
- createShapeWriters();
+ createShapeWriters(bmain->eval_ctx);
/* make a list of frames to export */
std::set<double> xform_frames;
@@ -227,7 +222,7 @@ void AbcExporter::operator()(float &progress)
progress = (++i / size);
double f = *begin;
- setCurrentFrame(f);
+ setCurrentFrame(bmain, f);
if (shape_frames.count(f) != 0) {
for (int i = 0, e = m_shapes.size(); i != e; ++i) {
@@ -256,7 +251,7 @@ void AbcExporter::operator()(float &progress)
}
}
-void AbcExporter::createTransformWritersHierarchy()
+void AbcExporter::createTransformWritersHierarchy(EvaluationContext *eval_ctx)
{
Base *base = static_cast<Base *>(m_scene->base.first);
@@ -273,7 +268,7 @@ void AbcExporter::createTransformWritersHierarchy()
break;
default:
- exploreTransform(ob, ob->parent, NULL);
+ exploreTransform(eval_ctx, ob, ob->parent, NULL);
}
}
@@ -297,11 +292,11 @@ void AbcExporter::createTransformWritersFlat()
}
}
-void AbcExporter::exploreTransform(Object *ob, Object *parent, Object *dupliObParent)
+void AbcExporter::exploreTransform(EvaluationContext *eval_ctx, Object *ob, Object *parent, Object *dupliObParent)
{
createTransformWriter(ob, parent, dupliObParent);
- ListBase *lb = object_duplilist(G.main->eval_ctx, m_scene, ob);
+ ListBase *lb = object_duplilist(eval_ctx, m_scene, ob);
if (lb) {
DupliObject *link = static_cast<DupliObject *>(lb->first);
@@ -309,15 +304,12 @@ void AbcExporter::exploreTransform(Object *ob, Object *parent, Object *dupliObPa
Object *dupli_parent = NULL;
while (link) {
- dupli_ob = link->ob;
-
- if (dupli_ob->parent)
- dupli_parent = dupli_ob->parent;
- else
- dupli_parent = ob;
+ if (link->type == OB_DUPLIGROUP) {
+ dupli_ob = link->ob;
+ dupli_parent = (dupli_ob->parent) ? dupli_ob->parent : ob;
- if (link->type == OB_DUPLIGROUP)
- exploreTransform(dupli_ob, dupli_parent, ob);
+ exploreTransform(eval_ctx, dupli_ob, dupli_parent, ob);
+ }
link = link->next;
}
@@ -363,21 +355,21 @@ void AbcExporter::createTransformWriter(Object *ob, Object *parent, Object *dupl
}
}
-void AbcExporter::createShapeWriters()
+void AbcExporter::createShapeWriters(EvaluationContext *eval_ctx)
{
Base *base = static_cast<Base *>(m_scene->base.first);
while (base) {
Object *ob = base->object;
- exploreObject(ob, NULL);
+ exploreObject(eval_ctx, ob, NULL);
base = base->next;
}
}
-void AbcExporter::exploreObject(Object *ob, Object *dupliObParent)
+void AbcExporter::exploreObject(EvaluationContext *eval_ctx, Object *ob, Object *dupliObParent)
{
- ListBase *lb = object_duplilist(G.main->eval_ctx, m_scene, ob);
+ ListBase *lb = object_duplilist(eval_ctx, m_scene, ob);
createShapeWriter(ob, dupliObParent);
@@ -389,7 +381,7 @@ void AbcExporter::exploreObject(Object *ob, Object *dupliObParent)
dupliob = link->ob;
if (link->type == OB_DUPLIGROUP) {
- exploreObject(dupliob, ob);
+ exploreObject(eval_ctx, dupliob, ob);
}
link = link->next;
@@ -516,16 +508,11 @@ AbcTransformWriter *AbcExporter::getXForm(const std::string &name)
return it->second;
}
-double AbcExporter::getCurrentFrame() const
-{
- return m_scene->r.cfra + m_scene->r.subframe;
-}
-
-void AbcExporter::setCurrentFrame(double t)
+void AbcExporter::setCurrentFrame(Main *bmain, double t)
{
m_scene->r.cfra = std::floor(t);
m_scene->r.subframe = t - m_scene->r.cfra;
- BKE_scene_update_for_newframe(G.main->eval_ctx, G.main, m_scene, (1<<20)-1);
+ BKE_scene_update_for_newframe(bmain->eval_ctx, bmain, m_scene, m_scene->lay);
}
bool AbcExporter::objectIsShape(Object *ob)
diff --git a/source/blender/alembic/intern/abc_exporter.h b/source/blender/alembic/intern/abc_exporter.h
index 64deca1..ef7e998 100644
--- a/source/blender/alembic/intern/abc_exporter.h
+++ b/source/blender/alembic/intern/abc_exporter.h
@@ -28,6 +28,8 @@
#include "abc_object.h"
#include "abc_transform.h"
+class EvaluationContext;
+
class AbcExporter {
ExportSettings &m_settings;
@@ -37,7 +39,6 @@ class AbcExporter {
unsigned int m_trans_sampling_index, m_shape_sampling_index;
Scene *m_scene;
- double m_saved_frame;
std::map<std::string, AbcTransformWriter *> m_xforms;
std::vector<AbcObjectWriter *> m_shapes;
@@ -46,11 +47,7 @@ public:
AbcExporter(Scene *scene, const char *filename, ExportSettings &settings);
~AbcExporter();
- void operator()(float &progress);
-
-protected:
- double getCurrentFrame() const;
- void setCurrentFrame(double t);
+ void operator()(Main *bmain, float &progress);
private:
void getShutterSamples(double step, bool time_relative, std::vector<double> &samples);
@@ -59,16 +56,18 @@ private:
void getFrameSet(double step, std::set<double> &frames);
- void createTransformWritersHierarchy();
+ void createTransformWritersHierarchy(EvaluationContext *eval_ctx);
void createTransformWritersFlat();
void createTransformWriter(Object *ob, Object *parent, Object *dupliObParent);
- void exploreTransform(Object *ob, Object *parent, Object *dupliObParent = NULL);
- void exploreObject(Object *ob, Object *dupliObParent);
- void createShapeWriters();
+ void exploreTransform(EvaluationContext *eval_ctx, Object *ob, Object *parent, Object *dupliObParent = NULL);
+ void exploreObject(EvaluationContext *eval_ctx, Object *ob, Object *dupliObParent);
+ void createShapeWriters(EvaluationContext *eval_ctx);
void createShapeWriter(Object *ob, Object *dupliObParent);
AbcTransformWriter *getXForm(const std::string &name);
bool objectIsShape(Object *ob);
bool objectIsSmokeSim(Object *ob);
+
+ void setCurrentFrame(Main *bmain, double t);
};
diff --git a/source/blender/alembic/intern/alembic_capi.cc b/source/blender/alembic/intern/alembic_capi.cc
index c2f17ff..9e75472 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -46,6 +46,8 @@ extern "C" {
#include "BKE_depsgraph.h"
#include "BKE_global.h"
#include "BKE_library.h"
+#include "BKE_main.h"
+#include "BKE_scene.h"
/* SpaceType struct has a member called 'new' which obviously conflicts with C++
* so temporarily redefining the new keyword to make it compile. */
@@ -242,6 +244,7 @@ int ABC_check_subobject_valid(const char *filepath, const char *object_path)
struct ExportJobData {
Scene *scene;
+ Main *bmain;
char filename[1024];
ExportSettings settings;
@@ -266,8 +269,19 @@ static void export_startjob(void *customdata, short *stop, short *do_update, flo
BKE_spacedata_draw_locks(true);
try {
- AbcExporter exporter(data->scene, data->filename, data->settings);
- exporter(*data->progress);
+ Scene *scene = data->scene;
+ AbcExporter exporter(scene, data->filename, data->settings);
+
+ const int orig_frame = CFRA;
+
+ exporter(data->bmain, *data->progress);
+
+ if (CFRA != orig_frame) {
+ CFRA = orig_frame;
+
+ BKE_scene_update_for_newframe(data->bmain->eval_ctx, data->bmain,
+ scene, scene->lay);
+ }
}
catch (const std::exception &e) {
std::cerr << "Abc Export error: " << e.what() << '\n';
@@ -299,6 +313,7 @@ int ABC_export(Scene *scene, bContext *C, const char *filepath,
{
ExportJobData *job = static_cast<ExportJobData *>(MEM_mallocN(sizeof(ExportJobData), "ExportJobData"));
job->scene = scene;
+ job->bmain = CTX_data_main(C);
BLI_strncpy(job->filename, filepath, 1024);
job->settings.scene = job->scene;
More information about the Bf-blender-cvs
mailing list