mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-09 13:12:40 +02:00
get model props spanning multiple packets
This commit is contained in:
parent
1cb5521f01
commit
2e5e6e3f61
6 changed files with 268 additions and 121 deletions
|
@ -132,7 +132,7 @@ void ModelItem::init(glm::vec3 position, float radius, rgbColor color, uint32_t
|
|||
_lastAnimated = now;
|
||||
}
|
||||
|
||||
OctreeElement::AppendState ModelItem::appendModelData(OctreePacketData* packetData, EncodeBitstreamParams& params) const {
|
||||
OctreeElement::AppendState ModelItem::oldVersionAppendModelData(OctreePacketData* packetData, EncodeBitstreamParams& params) const {
|
||||
|
||||
bool success = packetData->appendValue(getID());
|
||||
|
||||
|
@ -196,7 +196,8 @@ OctreeElement::AppendState ModelItem::appendModelData(OctreePacketData* packetDa
|
|||
return success ? OctreeElement::COMPLETED : OctreeElement::NONE;
|
||||
}
|
||||
|
||||
OctreeElement::AppendState ModelItem::new___appendModelData(OctreePacketData* packetData, EncodeBitstreamParams& params) const {
|
||||
OctreeElement::AppendState ModelItem::appendModelData(OctreePacketData* packetData, EncodeBitstreamParams& params,
|
||||
ModelTreeElementExtraEncodeData* modelTreeElementExtraEncodeData) const {
|
||||
|
||||
// ALL this fits...
|
||||
// object ID [16 bytes]
|
||||
|
@ -212,6 +213,29 @@ OctreeElement::AppendState ModelItem::new___appendModelData(OctreePacketData* pa
|
|||
ByteCountCoded<quint64> updateDeltaCoder = updateDelta;
|
||||
QByteArray encodedUpdateDelta = updateDeltaCoder;
|
||||
ModelPropertyFlags propertyFlags(PROP_LAST_ITEM);
|
||||
ModelPropertyFlags requestedProperties;
|
||||
|
||||
requestedProperties += PROP_POSITION;
|
||||
requestedProperties += PROP_RADIUS;
|
||||
requestedProperties += PROP_MODEL_URL;
|
||||
requestedProperties += PROP_ROTATION;
|
||||
requestedProperties += PROP_COLOR;
|
||||
requestedProperties += PROP_ANIMATION_URL;
|
||||
requestedProperties += PROP_ANIMATION_FPS;
|
||||
requestedProperties += PROP_ANIMATION_FRAME_INDEX;
|
||||
requestedProperties += PROP_ANIMATION_PLAYING;
|
||||
requestedProperties += PROP_SHOULD_BE_DELETED;
|
||||
|
||||
ModelPropertyFlags propertiesDidntFit = requestedProperties;
|
||||
|
||||
// If we are being called for a subsequent pass at appendModelData() that failed to completely encode this item,
|
||||
// then our modelTreeElementExtraEncodeData should include data about which properties we need to append.
|
||||
if (modelTreeElementExtraEncodeData && modelTreeElementExtraEncodeData->includedItems.contains(getModelItemID())) {
|
||||
requestedProperties = modelTreeElementExtraEncodeData->includedItems.value(getModelItemID());
|
||||
}
|
||||
|
||||
//qDebug() << "requestedProperties=";
|
||||
//requestedProperties.debugDumpBits();
|
||||
|
||||
LevelDetails modelLevel = packetData->startLevel();
|
||||
|
||||
|
@ -242,126 +266,206 @@ OctreeElement::AppendState ModelItem::new___appendModelData(OctreePacketData* pa
|
|||
// PROP_VISIBLE,
|
||||
|
||||
// PROP_POSITION
|
||||
LevelDetails propertyLevel = packetData->startLevel();
|
||||
successPropertyFits = packetData->appendPosition(getPosition());
|
||||
if (successPropertyFits) {
|
||||
propertyFlags |= PROP_POSITION;
|
||||
propertyCount++;
|
||||
packetData->endLevel(propertyLevel);
|
||||
if (requestedProperties.getHasProperty(PROP_POSITION)) {
|
||||
//qDebug() << "PROP_POSITION requested...";
|
||||
LevelDetails propertyLevel = packetData->startLevel();
|
||||
successPropertyFits = packetData->appendPosition(getPosition());
|
||||
if (successPropertyFits) {
|
||||
propertyFlags |= PROP_POSITION;
|
||||
propertiesDidntFit -= PROP_POSITION;
|
||||
propertyCount++;
|
||||
packetData->endLevel(propertyLevel);
|
||||
} else {
|
||||
//qDebug() << "PROP_POSITION didn't fit...";
|
||||
packetData->discardLevel(propertyLevel);
|
||||
appendState = OctreeElement::PARTIAL;
|
||||
}
|
||||
} else {
|
||||
packetData->discardLevel(propertyLevel);
|
||||
appendState = OctreeElement::PARTIAL;
|
||||
//qDebug() << "PROP_POSITION NOT requested...";
|
||||
propertiesDidntFit -= PROP_POSITION;
|
||||
}
|
||||
|
||||
// PROP_RADIUS
|
||||
propertyLevel = packetData->startLevel();
|
||||
successPropertyFits = packetData->appendValue(getRadius());
|
||||
if (successPropertyFits) {
|
||||
propertyFlags |= PROP_RADIUS;
|
||||
propertyCount++;
|
||||
packetData->endLevel(propertyLevel);
|
||||
if (requestedProperties.getHasProperty(PROP_RADIUS)) {
|
||||
//qDebug() << "PROP_RADIUS requested...";
|
||||
LevelDetails propertyLevel = packetData->startLevel();
|
||||
successPropertyFits = packetData->appendValue(getRadius());
|
||||
if (successPropertyFits) {
|
||||
propertyFlags |= PROP_RADIUS;
|
||||
propertiesDidntFit -= PROP_RADIUS;
|
||||
propertyCount++;
|
||||
packetData->endLevel(propertyLevel);
|
||||
} else {
|
||||
//qDebug() << "PROP_RADIUS didn't fit...";
|
||||
packetData->discardLevel(propertyLevel);
|
||||
appendState = OctreeElement::PARTIAL;
|
||||
}
|
||||
} else {
|
||||
packetData->discardLevel(propertyLevel);
|
||||
appendState = OctreeElement::PARTIAL;
|
||||
//qDebug() << "PROP_RADIUS NOT requested...";
|
||||
propertiesDidntFit -= PROP_RADIUS;
|
||||
}
|
||||
|
||||
// PROP_MODEL_URL
|
||||
propertyLevel = packetData->startLevel();
|
||||
successPropertyFits = packetData->appendValue(getModelURL());
|
||||
if (successPropertyFits) {
|
||||
propertyFlags |= PROP_MODEL_URL;
|
||||
propertyCount++;
|
||||
packetData->endLevel(propertyLevel);
|
||||
if (requestedProperties.getHasProperty(PROP_MODEL_URL)) {
|
||||
//qDebug() << "PROP_MODEL_URL requested...";
|
||||
LevelDetails propertyLevel = packetData->startLevel();
|
||||
successPropertyFits = packetData->appendValue(getModelURL());
|
||||
if (successPropertyFits) {
|
||||
propertyFlags |= PROP_MODEL_URL;
|
||||
propertiesDidntFit -= PROP_MODEL_URL;
|
||||
propertyCount++;
|
||||
packetData->endLevel(propertyLevel);
|
||||
} else {
|
||||
//qDebug() << "PROP_MODEL_URL didn't fit...";
|
||||
packetData->discardLevel(propertyLevel);
|
||||
appendState = OctreeElement::PARTIAL;
|
||||
}
|
||||
} else {
|
||||
packetData->discardLevel(propertyLevel);
|
||||
appendState = OctreeElement::PARTIAL;
|
||||
//qDebug() << "PROP_MODEL_URL NOT requested...";
|
||||
propertiesDidntFit -= PROP_MODEL_URL;
|
||||
}
|
||||
|
||||
// PROP_ROTATION
|
||||
propertyLevel = packetData->startLevel();
|
||||
successPropertyFits = packetData->appendValue(getModelRotation());
|
||||
if (successPropertyFits) {
|
||||
propertyFlags |= PROP_ROTATION;
|
||||
propertyCount++;
|
||||
packetData->endLevel(propertyLevel);
|
||||
if (requestedProperties.getHasProperty(PROP_ROTATION)) {
|
||||
//qDebug() << "PROP_ROTATION requested...";
|
||||
LevelDetails propertyLevel = packetData->startLevel();
|
||||
successPropertyFits = packetData->appendValue(getModelRotation());
|
||||
if (successPropertyFits) {
|
||||
propertyFlags |= PROP_ROTATION;
|
||||
propertiesDidntFit -= PROP_ROTATION;
|
||||
propertyCount++;
|
||||
packetData->endLevel(propertyLevel);
|
||||
} else {
|
||||
//qDebug() << "PROP_ROTATION didn't fit...";
|
||||
packetData->discardLevel(propertyLevel);
|
||||
appendState = OctreeElement::PARTIAL;
|
||||
}
|
||||
} else {
|
||||
packetData->discardLevel(propertyLevel);
|
||||
appendState = OctreeElement::PARTIAL;
|
||||
//qDebug() << "PROP_ROTATION NOT requested...";
|
||||
propertiesDidntFit -= PROP_ROTATION;
|
||||
}
|
||||
|
||||
// PROP_COLOR
|
||||
propertyLevel = packetData->startLevel();
|
||||
successPropertyFits = packetData->appendColor(getColor());
|
||||
if (successPropertyFits) {
|
||||
propertyFlags |= PROP_COLOR;
|
||||
propertyCount++;
|
||||
packetData->endLevel(propertyLevel);
|
||||
if (requestedProperties.getHasProperty(PROP_COLOR)) {
|
||||
//qDebug() << "PROP_COLOR requested...";
|
||||
LevelDetails propertyLevel = packetData->startLevel();
|
||||
successPropertyFits = packetData->appendColor(getColor());
|
||||
if (successPropertyFits) {
|
||||
propertyFlags |= PROP_COLOR;
|
||||
propertiesDidntFit -= PROP_COLOR;
|
||||
propertyCount++;
|
||||
packetData->endLevel(propertyLevel);
|
||||
} else {
|
||||
//qDebug() << "PROP_COLOR didn't fit...";
|
||||
packetData->discardLevel(propertyLevel);
|
||||
appendState = OctreeElement::PARTIAL;
|
||||
}
|
||||
} else {
|
||||
packetData->discardLevel(propertyLevel);
|
||||
appendState = OctreeElement::PARTIAL;
|
||||
//qDebug() << "PROP_COLOR NOT requested...";
|
||||
propertiesDidntFit -= PROP_COLOR;
|
||||
}
|
||||
|
||||
// PROP_SCRIPT
|
||||
// script would go here...
|
||||
|
||||
// PROP_ANIMATION_URL
|
||||
propertyLevel = packetData->startLevel();
|
||||
successPropertyFits = packetData->appendValue(getAnimationURL());
|
||||
if (successPropertyFits) {
|
||||
propertyFlags |= PROP_ANIMATION_URL;
|
||||
propertyCount++;
|
||||
packetData->endLevel(propertyLevel);
|
||||
if (requestedProperties.getHasProperty(PROP_ANIMATION_URL)) {
|
||||
//qDebug() << "PROP_ANIMATION_URL requested...";
|
||||
LevelDetails propertyLevel = packetData->startLevel();
|
||||
successPropertyFits = packetData->appendValue(getAnimationURL());
|
||||
if (successPropertyFits) {
|
||||
propertyFlags |= PROP_ANIMATION_URL;
|
||||
propertiesDidntFit -= PROP_ANIMATION_URL;
|
||||
propertyCount++;
|
||||
packetData->endLevel(propertyLevel);
|
||||
} else {
|
||||
//qDebug() << "PROP_ANIMATION_URL didn't fit...";
|
||||
packetData->discardLevel(propertyLevel);
|
||||
appendState = OctreeElement::PARTIAL;
|
||||
}
|
||||
} else {
|
||||
packetData->discardLevel(propertyLevel);
|
||||
appendState = OctreeElement::PARTIAL;
|
||||
//qDebug() << "PROP_ANIMATION_URL NOT requested...";
|
||||
propertiesDidntFit -= PROP_ANIMATION_URL;
|
||||
}
|
||||
|
||||
// PROP_ANIMATION_FPS
|
||||
propertyLevel = packetData->startLevel();
|
||||
successPropertyFits = packetData->appendValue(getAnimationFPS());
|
||||
if (successPropertyFits) {
|
||||
propertyFlags |= PROP_ANIMATION_FPS;
|
||||
propertyCount++;
|
||||
packetData->endLevel(propertyLevel);
|
||||
if (requestedProperties.getHasProperty(PROP_ANIMATION_FPS)) {
|
||||
//qDebug() << "PROP_ANIMATION_FPS requested...";
|
||||
LevelDetails propertyLevel = packetData->startLevel();
|
||||
successPropertyFits = packetData->appendValue(getAnimationFPS());
|
||||
if (successPropertyFits) {
|
||||
propertyFlags |= PROP_ANIMATION_FPS;
|
||||
propertiesDidntFit -= PROP_ANIMATION_FPS;
|
||||
propertyCount++;
|
||||
packetData->endLevel(propertyLevel);
|
||||
} else {
|
||||
//qDebug() << "PROP_ANIMATION_FPS didn't fit...";
|
||||
packetData->discardLevel(propertyLevel);
|
||||
appendState = OctreeElement::PARTIAL;
|
||||
}
|
||||
} else {
|
||||
packetData->discardLevel(propertyLevel);
|
||||
appendState = OctreeElement::PARTIAL;
|
||||
//qDebug() << "PROP_ANIMATION_FPS NOT requested...";
|
||||
propertiesDidntFit -= PROP_ANIMATION_FPS;
|
||||
}
|
||||
|
||||
// PROP_ANIMATION_FRAME_INDEX
|
||||
propertyLevel = packetData->startLevel();
|
||||
successPropertyFits = packetData->appendValue(getAnimationFrameIndex());
|
||||
if (successPropertyFits) {
|
||||
propertyFlags |= PROP_ANIMATION_FRAME_INDEX;
|
||||
propertyCount++;
|
||||
packetData->endLevel(propertyLevel);
|
||||
if (requestedProperties.getHasProperty(PROP_ANIMATION_FRAME_INDEX)) {
|
||||
//qDebug() << "PROP_ANIMATION_FRAME_INDEX requested...";
|
||||
LevelDetails propertyLevel = packetData->startLevel();
|
||||
successPropertyFits = packetData->appendValue(getAnimationFrameIndex());
|
||||
if (successPropertyFits) {
|
||||
propertyFlags |= PROP_ANIMATION_FRAME_INDEX;
|
||||
propertiesDidntFit -= PROP_ANIMATION_FRAME_INDEX;
|
||||
propertyCount++;
|
||||
packetData->endLevel(propertyLevel);
|
||||
} else {
|
||||
//qDebug() << "PROP_ANIMATION_FRAME_INDEX didn't fit...";
|
||||
packetData->discardLevel(propertyLevel);
|
||||
appendState = OctreeElement::PARTIAL;
|
||||
}
|
||||
} else {
|
||||
packetData->discardLevel(propertyLevel);
|
||||
appendState = OctreeElement::PARTIAL;
|
||||
//qDebug() << "PROP_ANIMATION_FRAME_INDEX NOT requested...";
|
||||
propertiesDidntFit -= PROP_ANIMATION_FRAME_INDEX;
|
||||
}
|
||||
|
||||
// PROP_ANIMATION_PLAYING
|
||||
propertyLevel = packetData->startLevel();
|
||||
successPropertyFits = packetData->appendValue(getAnimationIsPlaying());
|
||||
if (successPropertyFits) {
|
||||
propertyFlags |= PROP_ANIMATION_PLAYING;
|
||||
propertyCount++;
|
||||
packetData->endLevel(propertyLevel);
|
||||
if (requestedProperties.getHasProperty(PROP_ANIMATION_PLAYING)) {
|
||||
//qDebug() << "PROP_ANIMATION_PLAYING requested...";
|
||||
LevelDetails propertyLevel = packetData->startLevel();
|
||||
successPropertyFits = packetData->appendValue(getAnimationIsPlaying());
|
||||
if (successPropertyFits) {
|
||||
propertyFlags |= PROP_ANIMATION_PLAYING;
|
||||
propertiesDidntFit -= PROP_ANIMATION_PLAYING;
|
||||
propertyCount++;
|
||||
packetData->endLevel(propertyLevel);
|
||||
} else {
|
||||
//qDebug() << "PROP_ANIMATION_PLAYING didn't fit...";
|
||||
packetData->discardLevel(propertyLevel);
|
||||
appendState = OctreeElement::PARTIAL;
|
||||
}
|
||||
} else {
|
||||
packetData->discardLevel(propertyLevel);
|
||||
appendState = OctreeElement::PARTIAL;
|
||||
//qDebug() << "PROP_ANIMATION_PLAYING NOT requested...";
|
||||
propertiesDidntFit -= PROP_ANIMATION_PLAYING;
|
||||
}
|
||||
|
||||
// PROP_SHOULD_BE_DELETED
|
||||
propertyLevel = packetData->startLevel();
|
||||
successPropertyFits = packetData->appendValue(getShouldDie());
|
||||
if (successPropertyFits) {
|
||||
propertyFlags |= PROP_SHOULD_BE_DELETED;
|
||||
propertyCount++;
|
||||
packetData->endLevel(propertyLevel);
|
||||
if (requestedProperties.getHasProperty(PROP_SHOULD_BE_DELETED)) {
|
||||
//qDebug() << "PROP_SHOULD_BE_DELETED requested...";
|
||||
LevelDetails propertyLevel = packetData->startLevel();
|
||||
successPropertyFits = packetData->appendValue(getShouldDie());
|
||||
if (successPropertyFits) {
|
||||
propertyFlags |= PROP_SHOULD_BE_DELETED;
|
||||
propertiesDidntFit -= PROP_SHOULD_BE_DELETED;
|
||||
propertyCount++;
|
||||
packetData->endLevel(propertyLevel);
|
||||
} else {
|
||||
//qDebug() << "PROP_SHOULD_BE_DELETED didn't fit...";
|
||||
packetData->discardLevel(propertyLevel);
|
||||
appendState = OctreeElement::PARTIAL;
|
||||
}
|
||||
} else {
|
||||
packetData->discardLevel(propertyLevel);
|
||||
appendState = OctreeElement::PARTIAL;
|
||||
//qDebug() << "PROP_SHOULD_BE_DELETED NOT requested...";
|
||||
propertiesDidntFit -= PROP_SHOULD_BE_DELETED;
|
||||
}
|
||||
}
|
||||
if (propertyCount > 0) {
|
||||
|
@ -393,6 +497,18 @@ OctreeElement::AppendState ModelItem::new___appendModelData(OctreePacketData* pa
|
|||
packetData->discardLevel(modelLevel);
|
||||
appendState = OctreeElement::NONE; // if we got here, then we didn't include the item
|
||||
}
|
||||
|
||||
//qDebug() << "propertyFlags=";
|
||||
//propertyFlags.debugDumpBits();
|
||||
|
||||
//qDebug() << "propertiesDidntFit=";
|
||||
//propertiesDidntFit.debugDumpBits();
|
||||
|
||||
// If any part of the model items didn't fit, then the element is considered partial
|
||||
if (appendState != OctreeElement::COMPLETED) {
|
||||
// add this item into our list for the next appendElementData() pass
|
||||
modelTreeElementExtraEncodeData->includedItems.insert(getModelItemID(), propertiesDidntFit);
|
||||
}
|
||||
|
||||
return appendState;
|
||||
}
|
||||
|
@ -409,7 +525,7 @@ int ModelItem::expectedBytes() {
|
|||
return expectedBytes;
|
||||
}
|
||||
|
||||
int ModelItem::readModelDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args) {
|
||||
int ModelItem::oldVersionReadModelDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args) {
|
||||
|
||||
int bytesRead = 0;
|
||||
if (bytesLeftToRead >= expectedBytes()) {
|
||||
|
@ -499,7 +615,7 @@ int ModelItem::readModelDataFromBuffer(const unsigned char* data, int bytesLeftT
|
|||
return bytesRead;
|
||||
}
|
||||
|
||||
int ModelItem::new___readModelDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args) {
|
||||
int ModelItem::readModelDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args) {
|
||||
|
||||
// TODO: handle old format??
|
||||
//if (args.bitstreamVersion >= VERSION_MODELS_HAVE_ANIMATION) {
|
||||
|
|
|
@ -29,6 +29,7 @@ class ModelEditPacketSender;
|
|||
class ModelItemProperties;
|
||||
class ModelsScriptingInterface;
|
||||
class ModelTree;
|
||||
class ModelTreeElementExtraEncodeData;
|
||||
class ScriptEngine;
|
||||
class VoxelEditPacketSender;
|
||||
class VoxelsScriptingInterface;
|
||||
|
@ -286,11 +287,12 @@ public:
|
|||
|
||||
void setProperties(const ModelItemProperties& properties);
|
||||
|
||||
OctreeElement::AppendState new___appendModelData(OctreePacketData* packetData, EncodeBitstreamParams& params) const;
|
||||
int new___readModelDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args);
|
||||
|
||||
OctreeElement::AppendState appendModelData(OctreePacketData* packetData, EncodeBitstreamParams& params) const;
|
||||
OctreeElement::AppendState appendModelData(OctreePacketData* packetData, EncodeBitstreamParams& params,
|
||||
ModelTreeElementExtraEncodeData* modelTreeElementExtraEncodeData) const;
|
||||
int readModelDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args);
|
||||
|
||||
OctreeElement::AppendState oldVersionAppendModelData(OctreePacketData* packetData, EncodeBitstreamParams& params) const;
|
||||
int oldVersionReadModelDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args);
|
||||
static int expectedBytes();
|
||||
|
||||
static bool encodeModelEditMessageDetails(PacketType command, ModelItemID id, const ModelItemProperties& details,
|
||||
|
|
|
@ -74,7 +74,8 @@ public:
|
|||
|
||||
bool hasAnyDeletedModels() const { return _recentlyDeletedModelItemIDs.size() > 0; }
|
||||
bool hasModelsDeletedSince(quint64 sinceTime);
|
||||
bool encodeModelsDeletedSince(OCTREE_PACKET_SEQUENCE sequenceNumber, quint64& sinceTime, unsigned char* packetData, size_t maxLength, size_t& outputLength);
|
||||
bool encodeModelsDeletedSince(OCTREE_PACKET_SEQUENCE sequenceNumber, quint64& sinceTime,
|
||||
unsigned char* packetData, size_t maxLength, size_t& outputLength);
|
||||
void forgetModelsDeletedBefore(quint64 sinceTime);
|
||||
|
||||
void processEraseMessage(const QByteArray& dataByteArray, const SharedNodePointer& sourceNode);
|
||||
|
|
|
@ -56,14 +56,19 @@ ModelTreeElement* ModelTreeElement::addChildAtIndex(int index) {
|
|||
// contents across multiple packets.
|
||||
OctreeElement::AppendState ModelTreeElement::appendElementData(OctreePacketData* packetData,
|
||||
EncodeBitstreamParams& params) const {
|
||||
|
||||
|
||||
OctreeElement::AppendState appendElementState = OctreeElement::COMPLETED; // assume the best...
|
||||
|
||||
// first, check the params.extraEncodeData to see if there's any partial re-encode data for this element
|
||||
OctreeElementExtraEncodeData* extraEncodeData = params.extraEncodeData;
|
||||
ModelTreeElementExtraEncodeData* elementExtraEncodeData = NULL;
|
||||
ModelTreeElementExtraEncodeData* modelTreeElementExtraEncodeData = NULL;
|
||||
bool hadElementExtraData = false;
|
||||
if (extraEncodeData && extraEncodeData->contains(this)) {
|
||||
elementExtraEncodeData = static_cast<ModelTreeElementExtraEncodeData*>(extraEncodeData->value(this));
|
||||
modelTreeElementExtraEncodeData = static_cast<ModelTreeElementExtraEncodeData*>(extraEncodeData->value(this));
|
||||
hadElementExtraData = true;
|
||||
} else {
|
||||
// if there wasn't one already, then create one
|
||||
modelTreeElementExtraEncodeData = new ModelTreeElementExtraEncodeData();
|
||||
}
|
||||
|
||||
LevelDetails elementLevel = packetData->startLevel();
|
||||
|
@ -77,11 +82,8 @@ OctreeElement::AppendState ModelTreeElement::appendElementData(OctreePacketData*
|
|||
const ModelItem& model = (*_modelItems)[i];
|
||||
bool includeThisModel = true;
|
||||
|
||||
if (elementExtraEncodeData) {
|
||||
includeThisModel = elementExtraEncodeData->includedItems.contains(model.getModelItemID());
|
||||
if (includeThisModel) {
|
||||
elementExtraEncodeData->includedItems.remove(model.getModelItemID()); // remove it
|
||||
}
|
||||
if (hadElementExtraData) {
|
||||
includeThisModel = modelTreeElementExtraEncodeData->includedItems.contains(model.getModelItemID());
|
||||
}
|
||||
|
||||
if (includeThisModel && params.viewFrustum) {
|
||||
|
@ -107,7 +109,7 @@ OctreeElement::AppendState ModelTreeElement::appendElementData(OctreePacketData*
|
|||
|
||||
LevelDetails modelLevel = packetData->startLevel();
|
||||
|
||||
OctreeElement::AppendState appendModelState = model.appendModelData(packetData, params);
|
||||
OctreeElement::AppendState appendModelState = model.appendModelData(packetData, params, modelTreeElementExtraEncodeData);
|
||||
|
||||
// If none of this model data was able to be appended, then discard it
|
||||
// and don't include it in our model count
|
||||
|
@ -119,33 +121,33 @@ OctreeElement::AppendState ModelTreeElement::appendElementData(OctreePacketData*
|
|||
packetData->endLevel(modelLevel);
|
||||
actualNumberOfModels++;
|
||||
}
|
||||
|
||||
// If the model item got completely appended, then we can remove it from the extra encode data
|
||||
if (appendModelState == OctreeElement::COMPLETED) {
|
||||
modelTreeElementExtraEncodeData->includedItems.remove(model.getModelItemID());
|
||||
}
|
||||
|
||||
// If any part of the model items didn't fit, then the element is considered partial
|
||||
// NOTE: if the model item didn't fit or only partially fit, then the model item should have
|
||||
// added itself to the extra encode data.
|
||||
if (appendModelState != OctreeElement::COMPLETED) {
|
||||
appendElementState = OctreeElement::PARTIAL;
|
||||
|
||||
// add this item into our list for the next appendElementData() pass
|
||||
if (extraEncodeData) {
|
||||
if (!elementExtraEncodeData) {
|
||||
elementExtraEncodeData = new ModelTreeElementExtraEncodeData();
|
||||
}
|
||||
elementExtraEncodeData->includedItems.insert(model.getModelItemID(), true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If we were provided with extraEncodeData, and we allocated and/or got elementExtraEncodeData
|
||||
// then we need to do some additional processing
|
||||
if (extraEncodeData && elementExtraEncodeData) {
|
||||
// If we were provided with extraEncodeData, and we allocated and/or got modelTreeElementExtraEncodeData
|
||||
// then we need to do some additional processing, namely make sure our extraEncodeData is up to date for
|
||||
// this octree element.
|
||||
if (extraEncodeData && modelTreeElementExtraEncodeData) {
|
||||
|
||||
// If after processing we have some includedItems left in it, then make sure we re-add it back to our map
|
||||
if (elementExtraEncodeData->includedItems.size()) {
|
||||
extraEncodeData->insert(this, elementExtraEncodeData);
|
||||
if (modelTreeElementExtraEncodeData->includedItems.size()) {
|
||||
extraEncodeData->insert(this, modelTreeElementExtraEncodeData);
|
||||
} else {
|
||||
// otherwise, clean things up...
|
||||
extraEncodeData->remove(this);
|
||||
delete elementExtraEncodeData;
|
||||
delete modelTreeElementExtraEncodeData;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -343,16 +345,22 @@ bool ModelTreeElement::findSpherePenetration(const glm::vec3& center, float radi
|
|||
}
|
||||
|
||||
bool ModelTreeElement::updateModel(const ModelItem& model) {
|
||||
const bool wantDebug = false;
|
||||
if (wantDebug) {
|
||||
ModelItemID modelItemID = model.getModelItemID();
|
||||
qDebug() << "ModelTreeElement::updateModel(model) modelID.id="
|
||||
<< modelItemID.id << "creatorTokenID=" << modelItemID.creatorTokenID;
|
||||
}
|
||||
|
||||
// NOTE: this method must first lookup the model by ID, hence it is O(N)
|
||||
// and "model is not found" is worst-case (full N) but maybe we don't care?
|
||||
// (guaranteed that num models per elemen is small?)
|
||||
const bool wantDebug = false;
|
||||
uint16_t numberOfModels = _modelItems->size();
|
||||
for (uint16_t i = 0; i < numberOfModels; i++) {
|
||||
ModelItem& thisModel = (*_modelItems)[i];
|
||||
if (thisModel.getID() == model.getID()) {
|
||||
int difference = thisModel.getLastUpdated() - model.getLastUpdated();
|
||||
bool changedOnServer = thisModel.getLastEdited() < model.getLastEdited();
|
||||
bool changedOnServer = thisModel.getLastEdited() <= model.getLastEdited();
|
||||
bool localOlder = thisModel.getLastUpdated() < model.getLastUpdated();
|
||||
if (changedOnServer || localOlder) {
|
||||
if (wantDebug) {
|
||||
|
@ -506,6 +514,8 @@ bool ModelTreeElement::removeModelWithID(uint32_t id) {
|
|||
|
||||
int ModelTreeElement::readElementDataFromBuffer(const unsigned char* data, int bytesLeftToRead,
|
||||
ReadBitstreamToTreeParams& args) {
|
||||
|
||||
const bool wantDebugging = false;
|
||||
|
||||
// If we're the root, but this bitstream doesn't support root elements with data, then
|
||||
// return without reading any bytes
|
||||
|
@ -532,6 +542,22 @@ int ModelTreeElement::readElementDataFromBuffer(const unsigned char* data, int b
|
|||
for (uint16_t i = 0; i < numberOfModels; i++) {
|
||||
ModelItem tempModel;
|
||||
int bytesForThisModel = tempModel.readModelDataFromBuffer(dataAt, bytesLeftToRead, args);
|
||||
|
||||
if (wantDebugging) {
|
||||
ModelItemID modelItemID = tempModel.getModelItemID();
|
||||
qDebug() << "ModelTreeElement::readElementDataFromBuffer()... tempModel.modelItemID.id="
|
||||
<< modelItemID.id << "creatorTokenID=" << modelItemID.creatorTokenID;
|
||||
}
|
||||
|
||||
const ModelItem* existingModelItem = _myTree->findModelByID(modelItemID.id, true);
|
||||
if (existingModelItem) {
|
||||
//qDebug() << "ModelTreeElement::readElementDataFromBuffer()... model item already exists...";
|
||||
tempModel.copyChangedProperties(*existingModelItem); // copy original properties...
|
||||
bytesForThisModel = tempModel.readModelDataFromBuffer(dataAt, bytesLeftToRead, args); // reread only the changed properties
|
||||
}
|
||||
|
||||
//qDebug() << "ModelTreeElement::readElementDataFromBuffer()... _myTree->storeModel(tempModel)";
|
||||
|
||||
_myTree->storeModel(tempModel);
|
||||
dataAt += bytesForThisModel;
|
||||
bytesLeftToRead -= bytesForThisModel;
|
||||
|
|
|
@ -47,7 +47,7 @@ public:
|
|||
|
||||
class ModelTreeElementExtraEncodeData {
|
||||
public:
|
||||
QMap<ModelItemID, bool> includedItems; // for now, bool, soon ModelPropertyFlags
|
||||
QMap<ModelItemID, ModelPropertyFlags> includedItems; // for now, bool, soon ModelPropertyFlags
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -16,6 +16,8 @@
|
|||
|
||||
#include <ByteCountCoding.h>
|
||||
#include <ModelItem.h>
|
||||
#include <ModelTree.h>
|
||||
#include <ModelTreeElement.h>
|
||||
#include <Octree.h>
|
||||
#include <OctreeConstants.h>
|
||||
#include <PropertyFlags.h>
|
||||
|
@ -1270,7 +1272,7 @@ void OctreeTests::byteCountCodingTests(bool verbose) {
|
|||
void OctreeTests::modelItemTests(bool verbose) {
|
||||
|
||||
//verbose = true;
|
||||
|
||||
ModelTreeElementExtraEncodeData modelTreeElementExtraEncodeData;
|
||||
int testsTaken = 0;
|
||||
int testsPassed = 0;
|
||||
int testsFailed = 0;
|
||||
|
@ -1288,7 +1290,7 @@ void OctreeTests::modelItemTests(bool verbose) {
|
|||
modelItem.setID(1042);
|
||||
modelItem.setModelURL("http://foo.com/foo.fbx");
|
||||
|
||||
bool appendResult = modelItem.new___appendModelData(&packetData, params);
|
||||
bool appendResult = modelItem.appendModelData(&packetData, params, &modelTreeElementExtraEncodeData);
|
||||
int bytesWritten = packetData.getUncompressedSize();
|
||||
if (verbose) {
|
||||
qDebug() << "Test 1: bytesRead == bytesWritten ...";
|
||||
|
@ -1302,7 +1304,7 @@ void OctreeTests::modelItemTests(bool verbose) {
|
|||
const unsigned char* data = packetData.getUncompressedData();
|
||||
int bytesLeftToRead = packetData.getUncompressedSize();
|
||||
|
||||
int bytesRead = modelItemFromBuffer.new___readModelDataFromBuffer(data, bytesLeftToRead, args);
|
||||
int bytesRead = modelItemFromBuffer.readModelDataFromBuffer(data, bytesLeftToRead, args);
|
||||
if (verbose) {
|
||||
qDebug() << "bytesRead=" << bytesRead;
|
||||
qDebug() << "modelItemFromBuffer.getID()=" << modelItemFromBuffer.getID();
|
||||
|
@ -1343,7 +1345,7 @@ void OctreeTests::modelItemTests(bool verbose) {
|
|||
QByteArray garbageData(almostFullOfData, 0);
|
||||
packetData.appendValue(garbageData);
|
||||
|
||||
appendResult = modelItem.new___appendModelData(&packetData, params);
|
||||
appendResult = modelItem.appendModelData(&packetData, params, &modelTreeElementExtraEncodeData);
|
||||
bytesWritten = packetData.getUncompressedSize() - almostFullOfData;
|
||||
if (verbose) {
|
||||
qDebug() << "Test 3: attempt to appendModelData in nearly full packetData ...";
|
||||
|
@ -1370,7 +1372,7 @@ void OctreeTests::modelItemTests(bool verbose) {
|
|||
QByteArray garbageData(almostFullOfData, 0);
|
||||
packetData.appendValue(garbageData);
|
||||
|
||||
appendResult = modelItem.new___appendModelData(&packetData, params);
|
||||
appendResult = modelItem.appendModelData(&packetData, params, &modelTreeElementExtraEncodeData);
|
||||
bytesWritten = packetData.getUncompressedSize() - almostFullOfData;
|
||||
if (verbose) {
|
||||
qDebug() << "Test 4: attempt to appendModelData in nearly full packetData which some should fit ...";
|
||||
|
@ -1392,7 +1394,7 @@ void OctreeTests::modelItemTests(bool verbose) {
|
|||
const unsigned char* data = packetData.getUncompressedData() + almostFullOfData;
|
||||
int bytesLeftToRead = packetData.getUncompressedSize() - almostFullOfData;
|
||||
|
||||
int bytesRead = modelItemFromBuffer.new___readModelDataFromBuffer(data, bytesLeftToRead, args);
|
||||
int bytesRead = modelItemFromBuffer.readModelDataFromBuffer(data, bytesLeftToRead, args);
|
||||
if (verbose) {
|
||||
qDebug() << "Test 5: partial ModelItem written ... bytesRead == bytesWritten...";
|
||||
qDebug() << "bytesRead=" << bytesRead;
|
||||
|
|
Loading…
Reference in a new issue