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); \

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to