[Bf-blender-cvs] [cdfe06b] alembic_pointcache: Store an error handler inside readers and writers.

Lukas Tönne noreply at git.blender.org
Wed Nov 12 18:50:21 CET 2014


Commit: cdfe06bf515257c928f13ece0ced4be9b714b06b
Author: Lukas Tönne
Date:   Wed Nov 12 18:36:03 2014 +0100
Branches: alembic_pointcache
https://developer.blender.org/rBcdfe06bf515257c928f13ece0ced4be9b714b06b

Store an error handler inside readers and writers.

This is a lot more convenient to use and removes the burden of setting
the desired error handlers from the point cache user. The readers/writers
already know about context (e.g. a modifier) and can define an
appropriate error handler.

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

M	source/blender/modifiers/intern/MOD_pointcache.c
M	source/blender/pointcache/intern/mesh.cpp
M	source/blender/pointcache/intern/reader.cpp
M	source/blender/pointcache/intern/reader.h
M	source/blender/pointcache/intern/writer.cpp
M	source/blender/pointcache/intern/writer.h
M	source/blender/pointcache/util/util_error_handler.cpp
M	source/blender/pointcache/util/util_error_handler.h

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

diff --git a/source/blender/modifiers/intern/MOD_pointcache.c b/source/blender/modifiers/intern/MOD_pointcache.c
index 7137455..1b7ba00 100644
--- a/source/blender/modifiers/intern/MOD_pointcache.c
+++ b/source/blender/modifiers/intern/MOD_pointcache.c
@@ -100,8 +100,6 @@ static DerivedMesh *pointcache_do(PointCacheModifierData *pcmd, Object *ob, Deri
 	
 	DerivedMesh *finaldm = dm;
 	
-	PTC_error_handler_modifier(&pcmd->modifier);
-	
 	if (mode == MOD_POINTCACHE_MODE_NONE) {
 		mode = PTC_mod_point_cache_set_mode(scene, ob, pcmd, MOD_POINTCACHE_MODE_READ);
 	}
@@ -122,8 +120,6 @@ static DerivedMesh *pointcache_do(PointCacheModifierData *pcmd, Object *ob, Deri
 		}
 	}
 	
-	PTC_error_handler_std();
-	
 	return finaldm;
 }
 
diff --git a/source/blender/pointcache/intern/mesh.cpp b/source/blender/pointcache/intern/mesh.cpp
index e623616..aa24cd1 100644
--- a/source/blender/pointcache/intern/mesh.cpp
+++ b/source/blender/pointcache/intern/mesh.cpp
@@ -42,6 +42,8 @@ PointCacheWriter::PointCacheWriter(Scene *scene, Object *ob, PointCacheModifierD
     m_ob(ob),
     m_pcmd(pcmd)
 {
+	set_error_handler(new ModifierErrorHandler(&pcmd->modifier));
+	
 	uint32_t fs = add_frame_sampling();
 	
 	OObject root = m_archive.getTop();
@@ -177,6 +179,8 @@ PointCacheReader::PointCacheReader(Scene *scene, Object *ob, PointCacheModifierD
     m_pcmd(pcmd),
     m_result(NULL)
 {
+	set_error_handler(new ModifierErrorHandler(&pcmd->modifier));
+	
 	if (m_archive.valid()) {
 		IObject root = m_archive.getTop();
 		if (root.valid() && root.getChild(m_pcmd->modifier.name)) {
@@ -382,8 +386,6 @@ ePointCacheModifierMode PTC_mod_point_cache_get_mode(PointCacheModifierData *pcm
 
 ePointCacheModifierMode PTC_mod_point_cache_set_mode(Scene *scene, Object *ob, PointCacheModifierData *pcmd, ePointCacheModifierMode mode)
 {
-	PTC_error_handler_modifier(&pcmd->modifier);
-	
 	switch (mode) {
 		case MOD_POINTCACHE_MODE_READ:
 			if (pcmd->writer) {
@@ -416,6 +418,4 @@ ePointCacheModifierMode PTC_mod_point_cache_set_mode(Scene *scene, Object *ob, P
 			}
 			return MOD_POINTCACHE_MODE_NONE;
 	}
-	
-	PTC_error_handler_std();
 }
diff --git a/source/blender/pointcache/intern/reader.cpp b/source/blender/pointcache/intern/reader.cpp
index 21f4447..d20042f 100644
--- a/source/blender/pointcache/intern/reader.cpp
+++ b/source/blender/pointcache/intern/reader.cpp
@@ -35,16 +35,27 @@ using namespace Abc;
 
 Reader::Reader(Scene *scene, ID *id, PointCache *cache) :
     FrameMapper(scene),
+    m_error_handler(0),
     m_scene(scene)
 {
 	std::string filename = ptc_archive_path(cache, id);
 	PTC_SAFE_CALL_BEGIN
 	m_archive = IArchive(AbcCoreHDF5::ReadArchive(), filename, Abc::ErrorHandler::kThrowPolicy);
-	PTC_SAFE_CALL_END
+	PTC_SAFE_CALL_END_HANDLER(m_error_handler)
 }
 
 Reader::~Reader()
 {
+	if (m_error_handler)
+		delete m_error_handler;
+}
+
+void Reader::set_error_handler(ErrorHandler *handler)
+{
+	if (m_error_handler)
+		delete m_error_handler;
+	
+	m_error_handler = handler;
 }
 
 void Reader::get_frame_range(int &start_frame, int &end_frame)
diff --git a/source/blender/pointcache/intern/reader.h b/source/blender/pointcache/intern/reader.h
index 3b2bd1d..bc1e4c9 100644
--- a/source/blender/pointcache/intern/reader.h
+++ b/source/blender/pointcache/intern/reader.h
@@ -24,6 +24,7 @@
 #include <Alembic/Abc/IArchive.h>
 #include <Alembic/Abc/ISampleSelector.h>
 
+#include "util/util_error_handler.h"
 #include "util/util_frame_mapper.h"
 #include "util/util_types.h"
 
@@ -40,6 +41,8 @@ public:
 	Reader(Scene *scene, ID *id, PointCache *cache);
 	virtual ~Reader();
 	
+	void set_error_handler(ErrorHandler *handler);
+	
 	void get_frame_range(int &start_frame, int &end_frame);
 	Abc::ISampleSelector get_frame_sample_selector(float frame);
 	
@@ -48,6 +51,7 @@ public:
 	
 protected:
 	Abc::IArchive m_archive;
+	ErrorHandler *m_error_handler;
 	
 	Scene *m_scene;
 };
diff --git a/source/blender/pointcache/intern/writer.cpp b/source/blender/pointcache/intern/writer.cpp
index 28133a2..5dfee12 100644
--- a/source/blender/pointcache/intern/writer.cpp
+++ b/source/blender/pointcache/intern/writer.cpp
@@ -42,15 +42,28 @@ static void ensure_directory(const char *filename)
 
 Writer::Writer(Scene *scene, ID *id, PointCache *cache) :
     FrameMapper(scene),
+    m_error_handler(0),
     m_scene(scene)
 {
 	std::string filename = ptc_archive_path(cache, id);
 	ensure_directory(filename.c_str());
-	m_archive = OArchive(AbcCoreHDF5::WriteArchive(), filename, ErrorHandler::kThrowPolicy);
+	PTC_SAFE_CALL_BEGIN
+	m_archive = OArchive(AbcCoreHDF5::WriteArchive(), filename, Abc::ErrorHandler::kThrowPolicy);
+	PTC_SAFE_CALL_END_HANDLER(m_error_handler)
 }
 
 Writer::~Writer()
 {
+	if (m_error_handler)
+		delete m_error_handler;
+}
+
+void Writer::set_error_handler(ErrorHandler *handler)
+{
+	if (m_error_handler)
+		delete m_error_handler;
+	
+	m_error_handler = handler;
 }
 
 uint32_t Writer::add_frame_sampling()
diff --git a/source/blender/pointcache/intern/writer.h b/source/blender/pointcache/intern/writer.h
index b1301e2..3835f3f 100644
--- a/source/blender/pointcache/intern/writer.h
+++ b/source/blender/pointcache/intern/writer.h
@@ -23,6 +23,7 @@
 
 #include <Alembic/Abc/OArchive.h>
 
+#include "util/util_error_handler.h"
 #include "util/util_frame_mapper.h"
 
 struct ID;
@@ -38,12 +39,15 @@ public:
 	Writer(Scene *scene, ID *id, PointCache *cache);
 	virtual ~Writer();
 	
+	void set_error_handler(ErrorHandler *handler);
+	
 	uint32_t add_frame_sampling();
 	
 	virtual void write_sample() = 0;
 	
 protected:
 	Abc::OArchive m_archive;
+	ErrorHandler *m_error_handler;
 	
 	Scene *m_scene;
 };
diff --git a/source/blender/pointcache/util/util_error_handler.cpp b/source/blender/pointcache/util/util_error_handler.cpp
index 62db5d8..4447a68 100644
--- a/source/blender/pointcache/util/util_error_handler.cpp
+++ b/source/blender/pointcache/util/util_error_handler.cpp
@@ -18,6 +18,10 @@
 
 #include "util_error_handler.h"
 
+extern "C" {
+#include "BKE_modifier.h"
+}
+
 namespace PTC {
 
 ErrorHandler *ErrorHandler::m_default_handler = new StdErrorHandler(PTC_ERROR_INFO);
@@ -71,4 +75,15 @@ void CallbackErrorHandler::handle(PTCErrorLevel level, const char *message)
 	m_callback(m_userdata, level, message);
 }
 
+
+ModifierErrorHandler::ModifierErrorHandler(ModifierData *md) :
+    m_modifier(md)
+{
+}
+
+void ModifierErrorHandler::handle(PTCErrorLevel UNUSED(level), const char *message)
+{
+	modifier_setError(m_modifier, "%s", message);
+}
+
 } /* namespace PTC */
diff --git a/source/blender/pointcache/util/util_error_handler.h b/source/blender/pointcache/util/util_error_handler.h
index c535bac..41e5765 100644
--- a/source/blender/pointcache/util/util_error_handler.h
+++ b/source/blender/pointcache/util/util_error_handler.h
@@ -30,6 +30,7 @@ extern "C" {
 
 #include "util/util_types.h"
 
+struct ModifierData;
 struct ReportList;
 
 namespace PTC {
@@ -78,6 +79,18 @@ private:
 	void *m_userdata;
 };
 
+
+class ModifierErrorHandler : public ErrorHandler
+{
+public:
+	ModifierErrorHandler(ModifierData *md);
+	
+	void handle(PTCErrorLevel level, const char *message);
+	
+private:
+	ModifierData *m_modifier;
+};
+
 /* -------------------------------- */
 
 /* XXX With current Alembic version 1.5 we only get a combined error message.
@@ -118,10 +131,12 @@ void handle_alembic_exception(T &handler, PTCErrorLevel level, const Alembic::Ut
 template <typename T>
 void handle_alembic_exception(T *handler, PTCErrorLevel level, const Alembic::Util::Exception &e)
 {
-	const char *origin, *msg;
-	split_alembic_error_message(e.what(), &origin, &msg);
-	
-	handler->handle(level, msg);
+	if (handler) {
+		const char *origin, *msg;
+		split_alembic_error_message(e.what(), &origin, &msg);
+		
+		handler->handle(level, msg);
+	}
 }
 
 /* -------------------------------- */
@@ -131,7 +146,13 @@ void handle_alembic_exception(T *handler, PTCErrorLevel level, const Alembic::Ut
 #define PTC_SAFE_CALL_BEGIN \
 	try {
 
-#define PTC_SAFE_CALL_END_HANDLER(handler, level) \
+#define PTC_SAFE_CALL_END_HANDLER(handler) \
+	} \
+	catch (Alembic::Util::Exception e) { \
+		handle_alembic_exception((handler), PTC_ERROR_CRITICAL, e); \
+	}
+
+#define PTC_SAFE_CALL_END_HANDLER_LEVEL(handler, level) \
 	} \
 	catch (Alembic::Util::Exception e) { \
 		handle_alembic_exception((handler), (level), e); \




More information about the Bf-blender-cvs mailing list