fixed obj serialization issues

metadata
Wenzel Jakob 2010-08-27 15:33:22 +02:00
parent 1c550cc024
commit 723e8d951f
5 changed files with 40 additions and 13 deletions

View File

@ -80,6 +80,8 @@ public:
/// Return the shape's BSDF /// Return the shape's BSDF
inline const BSDF *getBSDF() const { return m_bsdf.get(); } inline const BSDF *getBSDF() const { return m_bsdf.get(); }
/// Return the shape's BSDF
inline BSDF *getBSDF() { return m_bsdf.get(); }
/// Return the name of this shape /// Return the name of this shape
inline const std::string &getName() const { return m_name; } inline const std::string &getName() const { return m_name; }

View File

@ -58,12 +58,12 @@ void InstanceManager::serialize(Stream *stream, const SerializableObject *inst)
} else if (m_objToId.find(inst) != m_objToId.end()) { } else if (m_objToId.find(inst) != m_objToId.end()) {
stream->writeUInt(m_objToId[inst]); stream->writeUInt(m_objToId[inst]);
} else { } else {
stream->writeUInt(++m_counter);
stream->writeString(inst->getClass()->getName());
m_objToId[inst]=m_counter;
#ifdef DEBUG_SERIALIZATION #ifdef DEBUG_SERIALIZATION
Log(EDebug, "Serializing a class of type '%s'", inst->getClass()->getName().c_str()); Log(EDebug, "Serializing a class of type '%s'", inst->getClass()->getName().c_str());
#endif #endif
stream->writeUInt(++m_counter);
stream->writeString(inst->getClass()->getName());
m_objToId[inst]=m_counter;
inst->serialize(stream, this); inst->serialize(stream, this);
} }
} }

View File

@ -21,7 +21,6 @@ TriMesh::TriMesh(const std::string &name, Transform worldToObject, Triangle *tri
m_name = name; m_name = name;
m_worldToObject = worldToObject; m_worldToObject = worldToObject;
m_objectToWorld.inverse(); m_objectToWorld.inverse();
} }
TriMesh::TriMesh(const Properties &props) TriMesh::TriMesh(const Properties &props)

View File

@ -64,7 +64,7 @@ private:
static int localWorkerCtr = 0, remoteWorkerCtr = 0; static int localWorkerCtr = 0, remoteWorkerCtr = 0;
MainWindow::MainWindow(QWidget *parent) : MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent), ui(new Ui::MainWindow) { QMainWindow(parent), ui(new Ui::MainWindow), m_activeWindowHack(false) {
Logger *logger = Thread::getThread()->getLogger(); Logger *logger = Thread::getThread()->getLogger();
#if defined(__OSX__) #if defined(__OSX__)
@ -110,7 +110,6 @@ MainWindow::MainWindow(QWidget *parent) :
#endif #endif
m_serverWidget = NULL; m_serverWidget = NULL;
m_contextIndex = -1; m_contextIndex = -1;
m_activeWindowHack = false;
for (int i = 0; i < MAX_RECENT_FILES; ++i) { for (int i = 0; i < MAX_RECENT_FILES; ++i) {
m_actRecent[i] = new QAction(this); m_actRecent[i] = new QAction(this);

View File

@ -8,7 +8,7 @@ MTS_NAMESPACE_BEGIN
/** /**
* Wavefront OBJ triangle mesh loader * Wavefront OBJ triangle mesh loader
*/ */
class WavefrontOBJ : public TriMesh { class WavefrontOBJ : public Shape {
public: public:
struct OBJTriangle { struct OBJTriangle {
unsigned int v[3]; unsigned int v[3];
@ -16,7 +16,7 @@ public:
unsigned int uv[3]; unsigned int uv[3];
}; };
WavefrontOBJ(const Properties &props) : TriMesh(props) { WavefrontOBJ(const Properties &props) : Shape(props) {
m_name = FileResolver::getInstance()->resolve(props.getString("filename")); m_name = FileResolver::getInstance()->resolve(props.getString("filename"));
/* Load the geometry */ /* Load the geometry */
@ -122,6 +122,24 @@ public:
triangles, hasNormals, hasTexcoords, currentMaterial); triangles, hasNormals, hasTexcoords, currentMaterial);
} }
WavefrontOBJ(Stream *stream, InstanceManager *manager) : Shape(stream, manager) {
unsigned int meshCount = stream->readUInt();
m_meshes.resize(meshCount);
for (unsigned int i=0; i<meshCount; ++i) {
m_meshes[i] = static_cast<TriMesh *>(manager->getInstance(stream));
m_meshes[i]->incRef();
}
}
void serialize(Stream *stream, InstanceManager *manager) const {
Shape::serialize(stream, manager);
stream->writeUInt((unsigned int) m_meshes.size());
for (size_t i=0; i<m_meshes.size(); ++i)
manager->serialize(stream, m_meshes[i]);
}
void parse(OBJTriangle &t, int i, const std::string &str) { void parse(OBJTriangle &t, int i, const std::string &str) {
std::vector<std::string> tokens = tokenize(str, "/"); std::vector<std::string> tokens = tokenize(str, "/");
if (tokens.size() == 1) { if (tokens.size() == 1) {
@ -269,9 +287,6 @@ public:
triangles.size(), vertexBuffer.size(), numMerged); triangles.size(), vertexBuffer.size(), numMerged);
} }
WavefrontOBJ(Stream *stream, InstanceManager *manager) : TriMesh(stream, manager) {
}
virtual ~WavefrontOBJ() { virtual ~WavefrontOBJ() {
for (size_t i=0; i<m_meshes.size(); ++i) for (size_t i=0; i<m_meshes.size(); ++i)
m_meshes[i]->decRef(); m_meshes[i]->decRef();
@ -297,6 +312,8 @@ public:
m_bsdf = static_cast<BSDF *>(child); m_bsdf = static_cast<BSDF *>(child);
for (size_t i=0; i<m_meshes.size(); ++i) for (size_t i=0; i<m_meshes.size(); ++i)
m_meshes[i]->addChild(name, child); m_meshes[i]->addChild(name, child);
Assert(m_meshes.size() > 0);
m_bsdf->setParent(NULL);
} else if (cClass->derivesFrom(Luminaire::m_theClass)) { } else if (cClass->derivesFrom(Luminaire::m_theClass)) {
Assert(m_luminaire == NULL && m_meshes.size() == 1); Assert(m_luminaire == NULL && m_meshes.size() == 1);
m_luminaire = static_cast<Luminaire *>(child); m_luminaire = static_cast<Luminaire *>(child);
@ -323,7 +340,17 @@ public:
Shape *getElement(int index) { Shape *getElement(int index) {
if (index >= (int) m_meshes.size()) if (index >= (int) m_meshes.size())
return NULL; return NULL;
return m_meshes[index]; Shape *shape = m_meshes[index];
BSDF *bsdf = shape->getBSDF();
Luminaire *luminaire = shape->getLuminaire();
Subsurface *subsurface = shape->getSubsurface();
if (bsdf)
bsdf->setParent(shape);
if (luminaire)
luminaire->setParent(shape);
if (subsurface)
subsurface->setParent(shape);
return shape;
} }
MTS_DECLARE_CLASS() MTS_DECLARE_CLASS()
@ -332,6 +359,6 @@ private:
std::map<std::string, BSDF *> m_materials; std::map<std::string, BSDF *> m_materials;
}; };
MTS_IMPLEMENT_CLASS_S(WavefrontOBJ, false, TriMesh) MTS_IMPLEMENT_CLASS_S(WavefrontOBJ, false, Shape)
MTS_EXPORT_PLUGIN(WavefrontOBJ, "OBJ triangle mesh loader"); MTS_EXPORT_PLUGIN(WavefrontOBJ, "OBJ triangle mesh loader");
MTS_NAMESPACE_END MTS_NAMESPACE_END