mirror of
https://github.com/overte-org/overte.git
synced 2025-04-19 15:43:50 +02:00
I believe this should fix some problems with flickering/crashing on edits:
don't reapply properties that we've already read (thus clearing cached data, stepping on other threads, etc.)
This commit is contained in:
parent
16de6a130b
commit
35bd1cda89
5 changed files with 46 additions and 20 deletions
|
@ -2432,12 +2432,13 @@ void MappedObjectStreamer::writeRawDelta(Bitstream& out, const QObject* object,
|
|||
}
|
||||
|
||||
QObject* MappedObjectStreamer::read(Bitstream& in, QObject* object) const {
|
||||
bool reread = (object != NULL);
|
||||
if (!object && _metaObject) {
|
||||
object = _metaObject->newInstance();
|
||||
}
|
||||
foreach (const StreamerPropertyPair& property, _properties) {
|
||||
QVariant value = property.first->read(in);
|
||||
if (property.second.isValid() && object) {
|
||||
if (property.second.isValid() && object && !reread) {
|
||||
property.second.write(object, value);
|
||||
}
|
||||
}
|
||||
|
@ -2445,6 +2446,7 @@ QObject* MappedObjectStreamer::read(Bitstream& in, QObject* object) const {
|
|||
}
|
||||
|
||||
QObject* MappedObjectStreamer::readRawDelta(Bitstream& in, const QObject* reference, QObject* object) const {
|
||||
bool reread = (object != NULL);
|
||||
if (!object && _metaObject) {
|
||||
object = _metaObject->newInstance();
|
||||
}
|
||||
|
@ -2452,7 +2454,7 @@ QObject* MappedObjectStreamer::readRawDelta(Bitstream& in, const QObject* refere
|
|||
QVariant value;
|
||||
property.first->readDelta(in, value, (property.second.isValid() && reference &&
|
||||
reference->metaObject() == _metaObject) ? property.second.read(reference) : QVariant());
|
||||
if (property.second.isValid() && object) {
|
||||
if (property.second.isValid() && object && !reread) {
|
||||
property.second.write(object, value);
|
||||
}
|
||||
}
|
||||
|
@ -2475,13 +2477,13 @@ void SharedObjectStreamer::writeRawDelta(Bitstream& out, const QObject* object,
|
|||
|
||||
QObject* SharedObjectStreamer::read(Bitstream& in, QObject* object) const {
|
||||
QObject* result = MappedObjectStreamer::read(in, object);
|
||||
static_cast<SharedObject*>(result)->readExtra(in);
|
||||
static_cast<SharedObject*>(result)->readExtra(in, object != NULL);
|
||||
return result;
|
||||
}
|
||||
|
||||
QObject* SharedObjectStreamer::readRawDelta(Bitstream& in, const QObject* reference, QObject* object) const {
|
||||
QObject* result = MappedObjectStreamer::readRawDelta(in, reference, object);
|
||||
static_cast<SharedObject*>(result)->readExtraDelta(in, static_cast<const SharedObject*>(reference));
|
||||
static_cast<SharedObject*>(result)->readExtraDelta(in, static_cast<const SharedObject*>(reference), object != NULL);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -2592,6 +2594,7 @@ void GenericObjectStreamer::writeRawDelta(Bitstream& out, const QObject* object,
|
|||
}
|
||||
|
||||
QObject* GenericObjectStreamer::read(Bitstream& in, QObject* object) const {
|
||||
bool reread = (object != NULL);
|
||||
if (!object) {
|
||||
object = new GenericSharedObject(_weakSelf);
|
||||
}
|
||||
|
@ -2599,11 +2602,14 @@ QObject* GenericObjectStreamer::read(Bitstream& in, QObject* object) const {
|
|||
foreach (const StreamerNamePair& property, _properties) {
|
||||
values.append(property.first->read(in));
|
||||
}
|
||||
static_cast<GenericSharedObject*>(object)->setValues(values);
|
||||
if (!reread) {
|
||||
static_cast<GenericSharedObject*>(object)->setValues(values);
|
||||
}
|
||||
return object;
|
||||
}
|
||||
|
||||
QObject* GenericObjectStreamer::readRawDelta(Bitstream& in, const QObject* reference, QObject* object) const {
|
||||
bool reread = (object != NULL);
|
||||
if (!object) {
|
||||
object = new GenericSharedObject(_weakSelf);
|
||||
}
|
||||
|
@ -2615,7 +2621,9 @@ QObject* GenericObjectStreamer::readRawDelta(Bitstream& in, const QObject* refer
|
|||
static_cast<const GenericSharedObject*>(reference)->getValues().at(i) : QVariant());
|
||||
values.append(value);
|
||||
}
|
||||
static_cast<GenericSharedObject*>(object)->setValues(values);
|
||||
if (!reread) {
|
||||
static_cast<GenericSharedObject*>(object)->setValues(values);
|
||||
}
|
||||
return object;
|
||||
}
|
||||
|
||||
|
|
|
@ -135,7 +135,7 @@ void SharedObject::writeExtra(Bitstream& out) const {
|
|||
// nothing by default
|
||||
}
|
||||
|
||||
void SharedObject::readExtra(Bitstream& in) {
|
||||
void SharedObject::readExtra(Bitstream& in, bool reread) {
|
||||
// nothing by default
|
||||
}
|
||||
|
||||
|
@ -143,7 +143,7 @@ void SharedObject::writeExtraDelta(Bitstream& out, const SharedObject* reference
|
|||
// nothing by default
|
||||
}
|
||||
|
||||
void SharedObject::readExtraDelta(Bitstream& in, const SharedObject* reference) {
|
||||
void SharedObject::readExtraDelta(Bitstream& in, const SharedObject* reference, bool reread) {
|
||||
// nothing by default
|
||||
}
|
||||
|
||||
|
|
|
@ -84,13 +84,15 @@ public:
|
|||
virtual void writeExtra(Bitstream& out) const;
|
||||
|
||||
/// Reads the non-property contents of this object from the specified stream.
|
||||
virtual void readExtra(Bitstream& in);
|
||||
/// \param reread if true, reread the contents from the stream but don't reapply them
|
||||
virtual void readExtra(Bitstream& in, bool reread = false);
|
||||
|
||||
/// Writes the delta-encoded non-property contents of this object to the specified stream.
|
||||
virtual void writeExtraDelta(Bitstream& out, const SharedObject* reference) const;
|
||||
|
||||
/// Reads the delta-encoded non-property contents of this object from the specified stream.
|
||||
virtual void readExtraDelta(Bitstream& in, const SharedObject* reference);
|
||||
/// \param reread if true, reread the contents from the stream but don't reapply them
|
||||
virtual void readExtraDelta(Bitstream& in, const SharedObject* reference, bool reread = false);
|
||||
|
||||
/// Writes the subdivision of the contents of this object (preceeded by a
|
||||
/// reference to the object itself) to the specified stream if necessary.
|
||||
|
|
|
@ -3678,9 +3678,18 @@ void Heightfield::writeExtra(Bitstream& out) const {
|
|||
_root->write(state);
|
||||
}
|
||||
|
||||
void Heightfield::readExtra(Bitstream& in) {
|
||||
void Heightfield::readExtra(Bitstream& in, bool reread) {
|
||||
if (getWillBeVoxelized()) {
|
||||
in >> _height >> _color >> _material >> _stack;
|
||||
if (reread) {
|
||||
HeightfieldHeightPointer height;
|
||||
HeightfieldColorPointer color;
|
||||
HeightfieldMaterialPointer material;
|
||||
HeightfieldStackPointer stack;
|
||||
in >> height >> color >> material >> stack;
|
||||
|
||||
} else {
|
||||
in >> _height >> _color >> _material >> _stack;
|
||||
}
|
||||
return;
|
||||
}
|
||||
MetavoxelLOD lod;
|
||||
|
@ -3692,7 +3701,9 @@ void Heightfield::readExtra(Bitstream& in) {
|
|||
|
||||
HeightfieldNodePointer root(new HeightfieldNode());
|
||||
root->read(state);
|
||||
setRoot(root);
|
||||
if (!reread) {
|
||||
setRoot(root);
|
||||
}
|
||||
}
|
||||
|
||||
void Heightfield::writeExtraDelta(Bitstream& out, const SharedObject* reference) const {
|
||||
|
@ -3716,7 +3727,7 @@ void Heightfield::writeExtraDelta(Bitstream& out, const SharedObject* reference)
|
|||
}
|
||||
}
|
||||
|
||||
void Heightfield::readExtraDelta(Bitstream& in, const SharedObject* reference) {
|
||||
void Heightfield::readExtraDelta(Bitstream& in, const SharedObject* reference, bool reread) {
|
||||
MetavoxelLOD lod, referenceLOD;
|
||||
if (in.getContext()) {
|
||||
MetavoxelStreamBase* base = static_cast<MetavoxelStreamBase*>(in.getContext());
|
||||
|
@ -3726,16 +3737,21 @@ void Heightfield::readExtraDelta(Bitstream& in, const SharedObject* reference) {
|
|||
HeightfieldStreamBase base = { in, lod, referenceLOD };
|
||||
HeightfieldStreamState state = { base, glm::vec2(), 1.0f };
|
||||
|
||||
setRoot(static_cast<const Heightfield*>(reference)->getRoot());
|
||||
bool changed;
|
||||
in >> changed;
|
||||
if (changed) {
|
||||
HeightfieldNodePointer root(new HeightfieldNode());
|
||||
root->readDelta(static_cast<const Heightfield*>(reference)->getRoot(), state);
|
||||
setRoot(root);
|
||||
|
||||
if (!reread) {
|
||||
setRoot(root);
|
||||
}
|
||||
} else if (state.becameSubdividedOrCollapsed()) {
|
||||
setRoot(HeightfieldNodePointer(_root->readSubdivision(state)));
|
||||
HeightfieldNodePointer root(_root->readSubdivision(state));
|
||||
if (!reread) {
|
||||
setRoot(root);
|
||||
}
|
||||
} else if (!reread) {
|
||||
setRoot(static_cast<const Heightfield*>(reference)->getRoot());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -820,9 +820,9 @@ public:
|
|||
virtual bool intersects(const glm::vec3& start, const glm::vec3& end, float& distance, glm::vec3& normal);
|
||||
|
||||
virtual void writeExtra(Bitstream& out) const;
|
||||
virtual void readExtra(Bitstream& in);
|
||||
virtual void readExtra(Bitstream& in, bool reread);
|
||||
virtual void writeExtraDelta(Bitstream& out, const SharedObject* reference) const;
|
||||
virtual void readExtraDelta(Bitstream& in, const SharedObject* reference);
|
||||
virtual void readExtraDelta(Bitstream& in, const SharedObject* reference, bool reread);
|
||||
virtual void maybeWriteSubdivision(Bitstream& out);
|
||||
virtual SharedObject* readSubdivision(Bitstream& in);
|
||||
|
||||
|
|
Loading…
Reference in a new issue