mirror of
https://github.com/overte-org/overte.git
synced 2025-07-23 18:24:08 +02:00
Very basic metavoxel save/load.
This commit is contained in:
parent
3f24feeb1d
commit
efe443e2ff
4 changed files with 93 additions and 0 deletions
|
@ -10,6 +10,9 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QSaveFile>
|
||||||
|
#include <QThread>
|
||||||
|
|
||||||
#include <PacketHeaders.h>
|
#include <PacketHeaders.h>
|
||||||
|
|
||||||
|
@ -44,6 +47,18 @@ void MetavoxelServer::run() {
|
||||||
|
|
||||||
_lastSend = QDateTime::currentMSecsSinceEpoch();
|
_lastSend = QDateTime::currentMSecsSinceEpoch();
|
||||||
_sendTimer.start(SEND_INTERVAL);
|
_sendTimer.start(SEND_INTERVAL);
|
||||||
|
|
||||||
|
// initialize Bitstream before using it in multiple threads
|
||||||
|
Bitstream::preThreadingInit();
|
||||||
|
|
||||||
|
// create the persister and start the it in its own thread
|
||||||
|
_persister = new MetavoxelPersister(this);
|
||||||
|
QThread* persistenceThread = new QThread(this);
|
||||||
|
_persister->moveToThread(persistenceThread);
|
||||||
|
persistenceThread->start();
|
||||||
|
|
||||||
|
// queue up the load
|
||||||
|
QMetaObject::invokeMethod(_persister, "load");
|
||||||
}
|
}
|
||||||
|
|
||||||
void MetavoxelServer::readPendingDatagrams() {
|
void MetavoxelServer::readPendingDatagrams() {
|
||||||
|
@ -67,6 +82,12 @@ void MetavoxelServer::readPendingDatagrams() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MetavoxelServer::aboutToFinish() {
|
||||||
|
QMetaObject::invokeMethod(_persister, "save", Q_ARG(const MetavoxelData&, _data));
|
||||||
|
_persister->thread()->quit();
|
||||||
|
_persister->thread()->wait();
|
||||||
|
}
|
||||||
|
|
||||||
void MetavoxelServer::maybeAttachSession(const SharedNodePointer& node) {
|
void MetavoxelServer::maybeAttachSession(const SharedNodePointer& node) {
|
||||||
if (node->getType() == NodeType::Agent) {
|
if (node->getType() == NodeType::Agent) {
|
||||||
QMutexLocker locker(&node->getMutex());
|
QMutexLocker locker(&node->getMutex());
|
||||||
|
@ -193,3 +214,41 @@ void MetavoxelSession::sendPacketGroup(int alreadySent) {
|
||||||
_sequencer.endPacket();
|
_sequencer.endPacket();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MetavoxelPersister::MetavoxelPersister(MetavoxelServer* server) :
|
||||||
|
_server(server) {
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* SAVE_FILE = "metavoxels.dat";
|
||||||
|
|
||||||
|
void MetavoxelPersister::load() {
|
||||||
|
QFile file(SAVE_FILE);
|
||||||
|
if (!file.exists()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
QDebug debug = qDebug() << "Reading from" << SAVE_FILE << "...";
|
||||||
|
file.open(QIODevice::ReadOnly);
|
||||||
|
QDataStream inStream(&file);
|
||||||
|
Bitstream in(inStream);
|
||||||
|
MetavoxelData data;
|
||||||
|
try {
|
||||||
|
in >> data;
|
||||||
|
} catch (const BitstreamException& e) {
|
||||||
|
debug << "failed, " << e.getDescription();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
QMetaObject::invokeMethod(_server, "setData", Q_ARG(const MetavoxelData&, data));
|
||||||
|
debug << "done.";
|
||||||
|
}
|
||||||
|
|
||||||
|
void MetavoxelPersister::save(const MetavoxelData& data) {
|
||||||
|
QDebug debug = qDebug() << "Writing to" << SAVE_FILE << "...";
|
||||||
|
QSaveFile file(SAVE_FILE);
|
||||||
|
file.open(QIODevice::WriteOnly);
|
||||||
|
QDataStream outStream(&file);
|
||||||
|
Bitstream out(outStream);
|
||||||
|
out << data;
|
||||||
|
out.flush();
|
||||||
|
file.commit();
|
||||||
|
debug << "done.";
|
||||||
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include <Endpoint.h>
|
#include <Endpoint.h>
|
||||||
|
|
||||||
class MetavoxelEditMessage;
|
class MetavoxelEditMessage;
|
||||||
|
class MetavoxelPersister;
|
||||||
class MetavoxelSession;
|
class MetavoxelSession;
|
||||||
|
|
||||||
/// Maintains a shared metavoxel system, accepting change requests and broadcasting updates.
|
/// Maintains a shared metavoxel system, accepting change requests and broadcasting updates.
|
||||||
|
@ -34,10 +35,14 @@ public:
|
||||||
|
|
||||||
const MetavoxelData& getData() const { return _data; }
|
const MetavoxelData& getData() const { return _data; }
|
||||||
|
|
||||||
|
Q_INVOKABLE void setData(const MetavoxelData& data) { _data = data; }
|
||||||
|
|
||||||
virtual void run();
|
virtual void run();
|
||||||
|
|
||||||
virtual void readPendingDatagrams();
|
virtual void readPendingDatagrams();
|
||||||
|
|
||||||
|
virtual void aboutToFinish();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void maybeAttachSession(const SharedNodePointer& node);
|
void maybeAttachSession(const SharedNodePointer& node);
|
||||||
|
@ -45,6 +50,8 @@ private slots:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
MetavoxelPersister* _persister;
|
||||||
|
|
||||||
QTimer _sendTimer;
|
QTimer _sendTimer;
|
||||||
qint64 _lastSend;
|
qint64 _lastSend;
|
||||||
|
|
||||||
|
@ -88,4 +95,20 @@ private:
|
||||||
int _reliableDeltaID;
|
int _reliableDeltaID;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Handles persistence in a separate thread.
|
||||||
|
class MetavoxelPersister : public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
MetavoxelPersister(MetavoxelServer* server);
|
||||||
|
|
||||||
|
Q_INVOKABLE void load();
|
||||||
|
Q_INVOKABLE void save(const MetavoxelData& data);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
MetavoxelServer* _server;
|
||||||
|
};
|
||||||
|
|
||||||
#endif // hifi_MetavoxelServer_h
|
#endif // hifi_MetavoxelServer_h
|
||||||
|
|
|
@ -87,6 +87,12 @@ IDStreamer& IDStreamer::operator>>(int& value) {
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Bitstream::preThreadingInit() {
|
||||||
|
getObjectStreamers();
|
||||||
|
getEnumStreamers();
|
||||||
|
getEnumStreamersByName();
|
||||||
|
}
|
||||||
|
|
||||||
int Bitstream::registerMetaObject(const char* className, const QMetaObject* metaObject) {
|
int Bitstream::registerMetaObject(const char* className, const QMetaObject* metaObject) {
|
||||||
getMetaObjects().insert(className, metaObject);
|
getMetaObjects().insert(className, metaObject);
|
||||||
|
|
||||||
|
|
|
@ -290,6 +290,11 @@ public:
|
||||||
QHash<int, SharedObjectPointer> sharedObjectValues;
|
QHash<int, SharedObjectPointer> sharedObjectValues;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Performs all of the various lazily initializations (of object streamers, etc.) If multiple threads need to use
|
||||||
|
/// Bitstream instances, call this beforehand to prevent errors from occurring when multiple threads attempt lazy
|
||||||
|
/// initialization simultaneously.
|
||||||
|
static void preThreadingInit();
|
||||||
|
|
||||||
/// Registers a metaobject under its name so that instances of it can be streamed. Consider using the REGISTER_META_OBJECT
|
/// Registers a metaobject under its name so that instances of it can be streamed. Consider using the REGISTER_META_OBJECT
|
||||||
/// at the top level of the source file associated with the class rather than calling this function directly.
|
/// at the top level of the source file associated with the class rather than calling this function directly.
|
||||||
/// \return zero; the function only returns a value so that it can be used in static initialization
|
/// \return zero; the function only returns a value so that it can be used in static initialization
|
||||||
|
|
Loading…
Reference in a new issue