[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