[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