[Bf-blender-cvs] [fe303b7] alembic_pointcache: Keep a reference to the stop, do_update and progress variables from the export job in the exporter class, so the exporter can communicate back to the main thread. This could be done nicer, but is ok for now.

Lukas Tönne noreply at git.blender.org
Thu Oct 16 16:53:05 CEST 2014


Commit: fe303b72947467bfbe1d70a5032b7a70dcbed012
Author: Lukas Tönne
Date:   Mon Nov 25 15:41:36 2013 +0100
Branches: alembic_pointcache
https://developer.blender.org/rBfe303b72947467bfbe1d70a5032b7a70dcbed012

Keep a reference to the stop, do_update and progress variables from
the export job in the exporter class, so the exporter can communicate
back to the main thread. This could be done nicer, but is ok for now.

===================================================================

M	source/blender/editors/physics/physics_pointcache.c
M	source/blender/pointcache/PTC_api.cpp
M	source/blender/pointcache/PTC_api.h
M	source/blender/pointcache/intern/export.cpp
M	source/blender/pointcache/intern/export.h

===================================================================

diff --git a/source/blender/editors/physics/physics_pointcache.c b/source/blender/editors/physics/physics_pointcache.c
index 4851927..4553cf1 100644
--- a/source/blender/editors/physics/physics_pointcache.c
+++ b/source/blender/editors/physics/physics_pointcache.c
@@ -418,6 +418,9 @@ typedef struct PTCacheExportJob {
 	struct Scene *scene;
 	struct PointCache *cache;
 	struct PTCWriter *writer;
+	
+	int origfra;				/* original frame to reset scene after export */
+	float origframelen;			/* original frame length to reset scene after export */
 } PTCacheExportJob;
 
 static void ptcache_export_freejob(void *customdata)
@@ -429,16 +432,21 @@ static void ptcache_export_freejob(void *customdata)
 static void ptcache_export_startjob(void *customdata, short *stop, short *do_update, float *progress)
 {
 	PTCacheExportJob *data= (PTCacheExportJob *)customdata;
+	Scene *scene = data->scene;
 	int start_frame, end_frame;
 	
 	data->stop = stop;
 	data->do_update = do_update;
 	data->progress = progress;
 	
+	data->origfra = scene->r.cfra;
+	data->origframelen = scene->r.framelen;
+	scene->r.framelen = 1.0f;
+	
 	/* XXX where to get this from? */
-	start_frame = data->scene->r.sfra;
-	end_frame = data->scene->r.efra;
-	PTC_bake(data->bmain, data->scene, data->writer, start_frame, end_frame);
+	start_frame = scene->r.sfra;
+	end_frame = scene->r.efra;
+	PTC_bake(data->bmain, scene, data->writer, start_frame, end_frame, stop, do_update, progress);
 	
 	*do_update = TRUE;
 	*stop = 0;
@@ -446,7 +454,16 @@ static void ptcache_export_startjob(void *customdata, short *stop, short *do_upd
 
 static void ptcache_export_endjob(void *customdata)
 {
-	/*PTCacheExportJob *data = (PTCacheExportJob *)customdata;*/
+	PTCacheExportJob *data = (PTCacheExportJob *)customdata;
+	Scene *scene = data->scene;
+	
+	/* free the cache writer (closes output file) */
+	PTC_writer_free(data->writer);
+	
+	/* reset scene frame */
+	scene->r.cfra = data->origfra;
+	scene->r.framelen = data->origframelen;
+	BKE_scene_update_for_newframe(data->bmain, scene, scene->lay);
 }
 
 static int ptcache_export_exec(bContext *C, wmOperator *op)
@@ -481,7 +498,7 @@ static int ptcache_export_exec(bContext *C, wmOperator *op)
 	WM_jobs_callbacks(wm_job, ptcache_export_startjob, NULL, NULL, ptcache_export_endjob);
 	
 	WM_jobs_start(CTX_wm_manager(C), wm_job);
-	
+
 	return OPERATOR_FINISHED;
 }
 
diff --git a/source/blender/pointcache/PTC_api.cpp b/source/blender/pointcache/PTC_api.cpp
index 52dc01d..a500876 100644
--- a/source/blender/pointcache/PTC_api.cpp
+++ b/source/blender/pointcache/PTC_api.cpp
@@ -49,10 +49,11 @@ void PTC_write_sample(struct PTCWriter *_writer)
 	writer->write_sample();
 }
 
-void PTC_bake(struct Main *bmain, struct Scene *scene, struct PTCWriter *_writer, int start_frame, int end_frame)
+void PTC_bake(struct Main *bmain, struct Scene *scene, struct PTCWriter *_writer, int start_frame, int end_frame,
+              short *stop, short *do_update, float *progress)
 {
 	PTC::Writer *writer = (PTC::Writer *)_writer;
-	PTC::Exporter exporter(bmain, scene);
+	PTC::Exporter exporter(bmain, scene, stop, do_update, progress);
 	exporter.bake(writer, start_frame, end_frame);
 }
 
diff --git a/source/blender/pointcache/PTC_api.h b/source/blender/pointcache/PTC_api.h
index bf761e8..8b37eee 100644
--- a/source/blender/pointcache/PTC_api.h
+++ b/source/blender/pointcache/PTC_api.h
@@ -41,7 +41,8 @@ void PTC_write_sample(struct PTCWriter *writer);
 void PTC_reader_free(struct PTCReader *reader);
 void PTC_read_sample(struct PTCReader *reader);
 
-void PTC_bake(struct Main *bmain, struct Scene *scene, struct PTCWriter *writer, int start_frame, int end_frame);
+void PTC_bake(struct Main *bmain, struct Scene *scene, struct PTCWriter *writer, int start_frame, int end_frame,
+              short *stop, short *do_update, float *progress);
 
 
 /* get writer/reader from RNA type */
diff --git a/source/blender/pointcache/intern/export.cpp b/source/blender/pointcache/intern/export.cpp
index c908295..ea4d5bb 100644
--- a/source/blender/pointcache/intern/export.cpp
+++ b/source/blender/pointcache/intern/export.cpp
@@ -28,37 +28,43 @@ extern "C" {
 
 namespace PTC {
 
-Exporter::Exporter(Main *bmain, Scene *scene) :
+Exporter::Exporter(Main *bmain, Scene *scene, short *stop, short *do_update, float *progress) :
     m_bmain(bmain),
     m_scene(scene),
-    m_cancel(false)
+    m_stop(stop),
+    m_do_update(do_update),
+    m_progress(progress)
 {
 }
 
 void Exporter::bake(Writer *writer, int start_frame, int end_frame)
 {
-	thread_scoped_lock(m_mutex);
+//	thread_scoped_lock(m_mutex);
+
+	set_progress(0.0f);
 
 	for (int cfra = start_frame; cfra <= end_frame; ++cfra) {
+		m_scene->r.cfra = cfra;
 		BKE_scene_update_for_newframe(m_bmain, m_scene, m_scene->lay);
 
 		writer->write_sample();
 
-		if (m_cancel)
+		set_progress((float)(cfra - start_frame + 1) / (float)(end_frame - start_frame + 1));
+
+		if (stop())
 			break;
 	}
 }
 
-bool Exporter::cancel() const
+bool Exporter::stop() const
 {
-	thread_scoped_lock(m_mutex);
-	return m_cancel;
+	return (bool)(*m_stop);
 }
 
-void Exporter::cancel(bool value)
+void Exporter::set_progress(float progress)
 {
-	thread_scoped_lock(m_mutex);
-	m_cancel = value;
+	*m_do_update = 1;
+	*m_progress = progress;
 }
 
 } /* namespace PTC */
diff --git a/source/blender/pointcache/intern/export.h b/source/blender/pointcache/intern/export.h
index 510f4d2..0fd0360 100644
--- a/source/blender/pointcache/intern/export.h
+++ b/source/blender/pointcache/intern/export.h
@@ -31,12 +31,13 @@ class Writer;
 class Exporter
 {
 public:
-	Exporter(Main *bmain, Scene *scene);
+	Exporter(Main *bmain, Scene *scene, short *stop, short *do_update, float *progress);
 	
 	void bake(Writer *writer, int start_frame, int end_frame);
 
-	bool cancel() const;
-	void cancel(bool value);
+	bool stop() const;
+
+	void set_progress(float progress);
 
 private:
 	thread_mutex m_mutex;
@@ -44,7 +45,9 @@ private:
 	Main *m_bmain;
 	Scene *m_scene;
 	
-	bool m_cancel;
+	short *m_stop;
+	short *m_do_update;
+	float *m_progress;
 };
 
 } /* namespace PTC */




More information about the Bf-blender-cvs mailing list