had to dumb this down a bit so that it compiles with GCC 4.2.1/OSX
parent
4895aeef7b
commit
38002c8450
|
@ -68,6 +68,9 @@ private:
|
||||||
# pragma warning( pop )
|
# pragma warning( pop )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/// Push a cleanup handler to be executed after loading the scene is done
|
||||||
|
extern MTS_EXPORT_RENDER void pushSceneCleanupHandler(void (*cleanup)());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief XML parser for Mitsuba scene files. To be used with the
|
* \brief XML parser for Mitsuba scene files. To be used with the
|
||||||
* SAX interface of Xerces-C++.
|
* SAX interface of Xerces-C++.
|
||||||
|
@ -101,9 +104,6 @@ public:
|
||||||
/// Free the memory taken up by staticInitialization()
|
/// Free the memory taken up by staticInitialization()
|
||||||
static void staticShutdown();
|
static void staticShutdown();
|
||||||
|
|
||||||
/// Push a cleanup handler to be executed after loading the scene is done
|
|
||||||
static void pushCleanupHandler(void (*cleanup)());
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
// Implementation of the SAX DocumentHandler interface
|
// Implementation of the SAX DocumentHandler interface
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
@ -136,8 +136,7 @@ protected:
|
||||||
private:
|
private:
|
||||||
struct ParseContext {
|
struct ParseContext {
|
||||||
inline ParseContext(ParseContext *_parent)
|
inline ParseContext(ParseContext *_parent)
|
||||||
: parent(_parent) {
|
: parent(_parent) { }
|
||||||
}
|
|
||||||
|
|
||||||
ParseContext *parent;
|
ParseContext *parent;
|
||||||
Properties properties;
|
Properties properties;
|
||||||
|
|
|
@ -274,7 +274,7 @@ void SceneHandler::startElement(const XMLCh* const xmlName,
|
||||||
m_context.push(context);
|
m_context.push(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SceneHandler::pushCleanupHandler(void (*cleanup)()) {
|
void pushSceneCleanupHandler(void (*cleanup)()) {
|
||||||
__cleanup_tls.get().insert(cleanup);
|
__cleanup_tls.get().insert(cleanup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <mitsuba/render/trimesh.h>
|
#include <mitsuba/render/trimesh.h>
|
||||||
#include <mitsuba/render/scenehandler.h>
|
|
||||||
#include <mitsuba/core/properties.h>
|
#include <mitsuba/core/properties.h>
|
||||||
#include <mitsuba/core/fstream.h>
|
#include <mitsuba/core/fstream.h>
|
||||||
#include <mitsuba/core/fresolver.h>
|
#include <mitsuba/core/fresolver.h>
|
||||||
|
@ -31,6 +30,9 @@
|
||||||
|
|
||||||
MTS_NAMESPACE_BEGIN
|
MTS_NAMESPACE_BEGIN
|
||||||
|
|
||||||
|
/* Avoid having to include scenehandler.h */
|
||||||
|
extern MTS_EXPORT_RENDER void pushSceneCleanupHandler(void (*cleanup)());
|
||||||
|
|
||||||
/*!\plugin{serialized}{Serialized mesh loader}
|
/*!\plugin{serialized}{Serialized mesh loader}
|
||||||
* \order{7}
|
* \order{7}
|
||||||
* \parameters{
|
* \parameters{
|
||||||
|
@ -251,16 +253,23 @@ private:
|
||||||
ref<FileStream> m_fstream;
|
ref<FileStream> m_fstream;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct FileStreamCache : LRUCache<fs::path, std::less<fs::path>,
|
typedef LRUCache<fs::path, std::less<fs::path>,
|
||||||
boost::shared_ptr<MeshLoader> > {
|
boost::shared_ptr<MeshLoader> > MeshLoaderCache;
|
||||||
|
|
||||||
|
class FileStreamCache : MeshLoaderCache {
|
||||||
|
public:
|
||||||
inline boost::shared_ptr<MeshLoader> get(const fs::path& path) {
|
inline boost::shared_ptr<MeshLoader> get(const fs::path& path) {
|
||||||
bool dummy;
|
bool dummy;
|
||||||
return LRUCache::get(path, dummy);
|
return MeshLoaderCache::get(path, dummy);
|
||||||
}
|
}
|
||||||
|
|
||||||
FileStreamCache() : LRUCache(MTS_SERIALIZED_CACHE_SIZE,
|
FileStreamCache() : MeshLoaderCache(MTS_SERIALIZED_CACHE_SIZE,
|
||||||
&boost::make_shared<MeshLoader, const fs::path&>) {}
|
&FileStreamCache::create) { }
|
||||||
|
|
||||||
|
private:
|
||||||
|
inline static boost::shared_ptr<MeshLoader> create(const fs::path &path) {
|
||||||
|
return boost::make_shared<MeshLoader>(path);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Release all currently held offset caches / file streams
|
/// Release all currently held offset caches / file streams
|
||||||
|
@ -280,7 +289,7 @@ private:
|
||||||
if (EXPECT_NOT_TAKEN(cache == NULL)) {
|
if (EXPECT_NOT_TAKEN(cache == NULL)) {
|
||||||
cache = new FileStreamCache();
|
cache = new FileStreamCache();
|
||||||
m_cache.set(cache);
|
m_cache.set(cache);
|
||||||
SceneHandler::pushCleanupHandler(&SerializedMesh::flushCache);
|
mitsuba::pushSceneCleanupHandler(&SerializedMesh::flushCache);
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::shared_ptr<MeshLoader> meshLoader = cache->get(filePath);
|
boost::shared_ptr<MeshLoader> meshLoader = cache->get(filePath);
|
||||||
|
|
Loading…
Reference in New Issue