diff --git a/libraries/metavoxels/src/Bitstream.cpp b/libraries/metavoxels/src/Bitstream.cpp index b3d5817fe9..f3ba1cca4d 100644 --- a/libraries/metavoxels/src/Bitstream.cpp +++ b/libraries/metavoxels/src/Bitstream.cpp @@ -1203,6 +1203,20 @@ void PropertyReader::readDelta(Bitstream& in, QObject* object, const QObject* re } } +PropertyWriter::PropertyWriter(const QMetaProperty& property, const TypeStreamer* streamer) : + _property(property), + _streamer(streamer) { +} + +void PropertyWriter::write(Bitstream& out, const QObject* object) const { + _streamer->write(out, _property.read(object)); +} + +void PropertyWriter::writeDelta(Bitstream& out, const QObject* object, const QObject* reference) const { + _streamer->writeDelta(out, _property.read(object), reference && object->metaObject() == reference->metaObject() ? + _property.read(reference) : QVariant()); +} + MetaField::MetaField(const QByteArray& name, const TypeStreamer* streamer) : _name(name), _streamer(streamer) { diff --git a/libraries/metavoxels/src/Bitstream.h b/libraries/metavoxels/src/Bitstream.h index 544d6dbd78..7e1551346a 100644 --- a/libraries/metavoxels/src/Bitstream.h +++ b/libraries/metavoxels/src/Bitstream.h @@ -804,6 +804,21 @@ private: QMetaProperty _property; }; +/// Contains the information necessary to obtain an object property and write it to the stream. +class PropertyWriter { +public: + + PropertyWriter(const QMetaProperty& property = QMetaProperty(), const TypeStreamer* streamer = NULL); + + void write(Bitstream& out, const QObject* object) const; + void writeDelta(Bitstream& out, const QObject* object, const QObject* reference) const; + +private: + + QMetaProperty _property; + const TypeStreamer* _streamer; +}; + /// Describes a metatype field. class MetaField { public: diff --git a/tests/metavoxels/src/MetavoxelTests.cpp b/tests/metavoxels/src/MetavoxelTests.cpp index 2400e086eb..1b7eaf9a22 100644 --- a/tests/metavoxels/src/MetavoxelTests.cpp +++ b/tests/metavoxels/src/MetavoxelTests.cpp @@ -51,6 +51,29 @@ static QByteArray createRandomBytes() { return createRandomBytes(MIN_BYTES, MAX_BYTES); } +static TestSharedObjectA::TestEnum getRandomTestEnum() { + switch (randIntInRange(0, 2)) { + case 0: return TestSharedObjectA::FIRST_TEST_ENUM; + case 1: return TestSharedObjectA::SECOND_TEST_ENUM; + case 2: + default: return TestSharedObjectA::THIRD_TEST_ENUM; + } +} + +static TestSharedObjectA::TestFlags getRandomTestFlags() { + TestSharedObjectA::TestFlags flags = 0; + if (randomBoolean()) { + flags |= TestSharedObjectA::FIRST_TEST_FLAG; + } + if (randomBoolean()) { + flags |= TestSharedObjectA::SECOND_TEST_FLAG; + } + if (randomBoolean()) { + flags |= TestSharedObjectA::THIRD_TEST_FLAG; + } + return flags; +} + static TestMessageC createRandomMessageC() { TestMessageC message; message.foo = randomBoolean(); @@ -64,7 +87,7 @@ static bool testSerialization(Bitstream::MetadataType metadataType) { QByteArray array; QDataStream outStream(&array, QIODevice::WriteOnly); Bitstream out(outStream, metadataType); - SharedObjectPointer testObjectWrittenA = new TestSharedObjectA(randFloat()); + SharedObjectPointer testObjectWrittenA = new TestSharedObjectA(randFloat(), getRandomTestEnum(), getRandomTestFlags()); out << testObjectWrittenA; SharedObjectPointer testObjectWrittenB = new TestSharedObjectB(randFloat(), createRandomBytes()); out << testObjectWrittenB; @@ -175,7 +198,7 @@ bool MetavoxelTests::run() { static SharedObjectPointer createRandomSharedObject() { switch (randIntInRange(0, 2)) { - case 0: return new TestSharedObjectA(randFloat()); + case 0: return new TestSharedObjectA(randFloat(), getRandomTestEnum(), getRandomTestFlags()); case 1: return new TestSharedObjectB(); case 2: default: return SharedObjectPointer(); @@ -393,8 +416,10 @@ void Endpoint::readReliableChannel() { streamedBytesReceived += bytes.size(); } -TestSharedObjectA::TestSharedObjectA(float foo) : - _foo(foo) { +TestSharedObjectA::TestSharedObjectA(float foo, TestEnum baz, TestFlags bong) : + _foo(foo), + _baz(baz), + _bong(bong) { sharedObjectsCreated++; } diff --git a/tests/metavoxels/src/MetavoxelTests.h b/tests/metavoxels/src/MetavoxelTests.h index 206c818c6e..6e0b857328 100644 --- a/tests/metavoxels/src/MetavoxelTests.h +++ b/tests/metavoxels/src/MetavoxelTests.h @@ -70,16 +70,31 @@ private: /// A simple shared object. class TestSharedObjectA : public SharedObject { Q_OBJECT + Q_ENUMS(TestEnum) + Q_FLAGS(TestFlag TestFlags) Q_PROPERTY(float foo READ getFoo WRITE setFoo NOTIFY fooChanged) + Q_PROPERTY(TestEnum baz READ getBaz WRITE setBaz) + Q_PROPERTY(TestFlags bong READ getBong WRITE setBong) public: - Q_INVOKABLE TestSharedObjectA(float foo = 0.0f); + enum TestEnum { FIRST_TEST_ENUM, SECOND_TEST_ENUM, THIRD_TEST_ENUM }; + + enum TestFlag { NO_TEST_FLAGS = 0x0, FIRST_TEST_FLAG = 0x01, SECOND_TEST_FLAG = 0x02, THIRD_TEST_FLAG = 0x03 }; + Q_DECLARE_FLAGS(TestFlags, TestFlag) + + Q_INVOKABLE TestSharedObjectA(float foo = 0.0f, TestEnum baz = FIRST_TEST_ENUM, TestFlags bong = 0); virtual ~TestSharedObjectA(); void setFoo(float foo); float getFoo() const { return _foo; } + void setBaz(TestEnum baz) { _baz = baz; } + TestEnum getBaz() const { return _baz; } + + void setBong(TestFlags bong) { _bong = bong; } + TestFlags getBong() const { return _bong; } + signals: void fooChanged(float foo); @@ -87,6 +102,8 @@ signals: private: float _foo; + TestEnum _baz; + TestFlags _bong; }; /// Another simple shared object.