From 6be18109679874eeb5b0f2a765cca786203c54ba Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Wed, 26 Nov 2014 17:57:03 -0800 Subject: [PATCH] More work on subdivision. --- libraries/metavoxels/src/SharedObject.cpp | 8 ++++++ libraries/metavoxels/src/SharedObject.h | 6 +++++ libraries/metavoxels/src/Spanner.cpp | 31 +++++++++++++++++++++++ libraries/metavoxels/src/Spanner.h | 2 ++ 4 files changed, 47 insertions(+) diff --git a/libraries/metavoxels/src/SharedObject.cpp b/libraries/metavoxels/src/SharedObject.cpp index e57b7d9a8e..8f57c8be34 100644 --- a/libraries/metavoxels/src/SharedObject.cpp +++ b/libraries/metavoxels/src/SharedObject.cpp @@ -147,6 +147,14 @@ void SharedObject::readExtraDelta(Bitstream& in, const SharedObject* reference) // nothing by default } +void SharedObject::writeExtraSubdivision(Bitstream& out) { + // nothing by default +} + +void SharedObject::readExtraSubdivision(Bitstream& in) { + // nothing by default +} + QAtomicInt SharedObject::_nextID(1); WeakSharedObjectHash SharedObject::_weakHash; QReadWriteLock SharedObject::_weakHashLock; diff --git a/libraries/metavoxels/src/SharedObject.h b/libraries/metavoxels/src/SharedObject.h index 7f44ffec82..f35fde802c 100644 --- a/libraries/metavoxels/src/SharedObject.h +++ b/libraries/metavoxels/src/SharedObject.h @@ -92,6 +92,12 @@ public: /// Reads the delta-encoded non-property contents of this object from the specified stream. virtual void readExtraDelta(Bitstream& in, const SharedObject* reference); + /// Writes the subdivision of the non-property contents of this object to the specified stream. + virtual void writeExtraSubdivision(Bitstream& out); + + /// Reads the subdivision of the non-property contents of this object from the specified stream. + virtual void readExtraSubdivision(Bitstream& in); + private: int _id; diff --git a/libraries/metavoxels/src/Spanner.cpp b/libraries/metavoxels/src/Spanner.cpp index 608dbc77c2..bdccb18b7e 100644 --- a/libraries/metavoxels/src/Spanner.cpp +++ b/libraries/metavoxels/src/Spanner.cpp @@ -2731,6 +2731,37 @@ void Heightfield::readExtraDelta(Bitstream& in, const SharedObject* reference) { } } +void Heightfield::writeExtraSubdivision(Bitstream& out) { + MetavoxelLOD lod, referenceLOD; + if (out.getContext()) { + MetavoxelStreamBase* base = static_cast(out.getContext()); + lod = transformLOD(base->lod); + referenceLOD = transformLOD(base->referenceLOD); + } + HeightfieldStreamBase base = { out, lod, referenceLOD }; + HeightfieldStreamState state = { base, glm::vec2(), 1.0f }; + + if (state.becameSubdivided()) { + out << SharedObjectPointer(this); + _root->writeSubdivision(state); + } +} + +void Heightfield::readExtraSubdivision(Bitstream& in) { + MetavoxelLOD lod, referenceLOD; + if (in.getContext()) { + MetavoxelStreamBase* base = static_cast(in.getContext()); + lod = transformLOD(base->lod); + referenceLOD = transformLOD(base->referenceLOD); + } + HeightfieldStreamBase base = { in, lod, referenceLOD }; + HeightfieldStreamState state = { base, glm::vec2(), 1.0f }; + + if (state.becameSubdividedOrCollapsed()) { + setRoot(HeightfieldNodePointer(_root->readSubdivision(state))); + } +} + QByteArray Heightfield::getRendererClassName() const { return "HeightfieldRenderer"; } diff --git a/libraries/metavoxels/src/Spanner.h b/libraries/metavoxels/src/Spanner.h index 0b24c7e318..c832d3fbd5 100644 --- a/libraries/metavoxels/src/Spanner.h +++ b/libraries/metavoxels/src/Spanner.h @@ -592,6 +592,8 @@ public: virtual void readExtra(Bitstream& in); virtual void writeExtraDelta(Bitstream& out, const SharedObject* reference) const; virtual void readExtraDelta(Bitstream& in, const SharedObject* reference); + virtual void writeExtraSubdivision(Bitstream& out); + virtual void readExtraSubdivision(Bitstream& in); signals: