diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 16b7e42a08..e2f8bfafbe 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -42,9 +42,7 @@ void EntityItem::initFromEntityItemID(const EntityItemID& entityItemID) { // init values with defaults before calling setProperties //uint64_t now = usecTimestampNow(); - _lastEditedRemote = 0; - _lastEditedLocal = 0; - //_lastEdited = 0; + _lastEdited = 0; _lastUpdated = 0; _created = 0; // TODO: when do we actually want to make this "now" @@ -62,9 +60,7 @@ void EntityItem::initFromEntityItemID(const EntityItemID& entityItemID) { EntityItem::EntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) { _type = EntityTypes::Unknown; - _lastEditedRemote = 0; - _lastEditedLocal = 0; - //_lastEdited = 0; + _lastEdited = 0; _lastUpdated = 0; _created = properties.getCreated(); initFromEntityItemID(entityItemID); @@ -120,10 +116,18 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet requestedProperties = entityTreeElementExtraEncodeData->entities.value(getEntityItemID()); } - LevelDetails modelLevel = packetData->startLevel(); + LevelDetails entityLevel = packetData->startLevel(); quint64 lastEdited = getLastEdited(); - + + const bool wantDebug = false; + if (wantDebug) { + float editedAgo = getEditedAgo(); + QString agoAsString = formatSecondsElapsed(editedAgo); + qDebug() << "Writing entity " << getEntityItemID() << " to buffer, lastEdited =" << lastEdited + << " ago=" << editedAgo << "seconds - " << agoAsString; + } + bool successIDFits = false; bool successTypeFits = false; bool successCreatedFits = false; @@ -210,9 +214,9 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet assert(newPropertyFlagsLength == oldPropertyFlagsLength); // should not have grown } - packetData->endLevel(modelLevel); + packetData->endLevel(entityLevel); } else { - packetData->discardLevel(modelLevel); + packetData->discardLevel(entityLevel); appendState = OctreeElement::NONE; // if we got here, then we didn't include the item } @@ -302,9 +306,15 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef _created = createdFromBuffer; // TODO: do we ever want to discard this??? if (wantDebug) { + quint64 lastEdited = getLastEdited(); + float editedAgo = getEditedAgo(); + QString agoAsString = formatSecondsElapsed(editedAgo); QString ageAsString = formatSecondsElapsed(getAge()); - qDebug() << "Loading entity " << getEntityItemID() << " from buffer, _created =" << _created - << " age=" << getAge() << "seconds - " << ageAsString; + qDebug() << "Loading entity " << getEntityItemID() << " from buffer..."; + qDebug() << " _created =" << _created; + qDebug() << " age=" << getAge() << "seconds - " << ageAsString; + qDebug() << " lastEdited =" << lastEdited; + qDebug() << " ago=" << editedAgo << "seconds - " << agoAsString; } quint64 lastEditedFromBuffer = 0; @@ -322,8 +332,6 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef qDebug() << " entityItemID=" << getEntityItemID(); qDebug() << " now=" << usecTimestampNow(); qDebug() << " getLastEdited();=" << getLastEdited(); - qDebug() << " _lastEditedRemote=" << _lastEditedRemote; - qDebug() << " _lastEditedLocal=" << _lastEditedLocal; qDebug() << " lastEditedFromBuffer=" << lastEditedFromBuffer << " (BEFORE clockskew adjust)"; qDebug() << " clockSkew=" << clockSkew; qDebug() << " lastEditedFromBufferAdjusted=" << lastEditedFromBufferAdjusted << " (AFTER clockskew adjust)"; @@ -332,7 +340,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef // If we've changed our local tree more recently than the new data from this packet // then we will not be changing our values, instead we just read and skip the data - if (_lastEditedLocal > lastEditedFromBufferAdjusted) { + if (_lastEdited > lastEditedFromBufferAdjusted) { overwriteLocalData = false; if (wantDebug) { qDebug() << "IGNORING old data from server!!! ****************"; @@ -343,8 +351,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef qDebug() << "USING NEW data from server!!! ****************"; } - _lastEditedRemote = lastEditedFromBuffer; - _lastEditedRemoteClockSkew = clockSkew; + _lastEdited = lastEditedFromBufferAdjusted; somethingChangedNotification(); // notify derived classes that something has changed } @@ -354,6 +361,11 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef quint64 updateDelta = updateDeltaCoder; if (overwriteLocalData) { _lastUpdated = lastEditedFromBufferAdjusted + updateDelta; // don't adjust for clock skew since we already did that for _lastEdited + if (wantDebug) { + qDebug() << "_lastUpdated=" << _lastUpdated; + qDebug() << "_lastEdited=" << _lastEdited; + qDebug() << "lastEditedFromBufferAdjusted=" << lastEditedFromBufferAdjusted; + } } encodedUpdateDelta = updateDeltaCoder; // determine true length dataAt += encodedUpdateDelta.size(); @@ -417,7 +429,16 @@ bool EntityItem::isRestingOnSurface() const { void EntityItem::update(const quint64& updateTime) { bool wantDebug = false; + float timeElapsed = (float)(updateTime - _lastUpdated) / (float)(USECS_PER_SECOND); + + if (wantDebug) { + qDebug() << "********** EntityItem::update()"; + qDebug() << " updateTime=" << updateTime; + qDebug() << " _lastUpdated=" << _lastUpdated; + qDebug() << " timeElapsed=" << timeElapsed; + } + _lastUpdated = updateTime; if (wantDebug) { diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 1a67ee5ace..3ae62ccb86 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -64,8 +64,8 @@ public: quint64 getLastUpdated() const { return _lastUpdated; } /// Last simulated time of this entity universal usecs /// Last edited time of this entity universal usecs - quint64 getLastEdited() const { return std::max((_lastEditedRemote - _lastEditedRemoteClockSkew), _lastEditedLocal); } - void setLastEdited(quint64 lastEdited) { _lastEditedLocal = lastEdited; _lastEditedLocal = lastEdited; } + quint64 getLastEdited() const { return _lastEdited; } + void setLastEdited(quint64 lastEdited) { _lastEdited = _lastUpdated = lastEdited; } float getEditedAgo() const /// Elapsed seconds since this entity was last edited { return (float)(usecTimestampNow() - getLastEdited()) / (float)USECS_PER_SECOND; } @@ -190,10 +190,7 @@ protected: uint32_t _creatorTokenID; bool _newlyCreated; quint64 _lastUpdated; - //quint64 _lastEdited; - quint64 _lastEditedLocal; - quint64 _lastEditedRemote; - quint64 _lastEditedRemoteClockSkew; + quint64 _lastEdited; quint64 _created; glm::vec3 _position; diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 8cf89429ae..99eafc012e 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -29,6 +29,7 @@ ModelEntityItem::ModelEntityItem(const EntityItemID& entityItemID, const EntityI _animationFrameIndex = 0.0f; _lastAnimated = usecTimestampNow(); _jointMappingCompleted = false; + _color[0] = _color[1] = _color[2] = 0; } EntityItemProperties ModelEntityItem::getProperties() const { @@ -156,11 +157,11 @@ int ModelEntityItem::oldVersionReadEntityDataFromBuffer(const unsigned char* dat _lastUpdated -= clockSkew; // _lastEdited - memcpy(&_lastEditedRemote, dataAt, sizeof(_lastEditedRemote)); - dataAt += sizeof(_lastEditedRemote); - bytesRead += sizeof(_lastEditedRemote); - _lastEditedRemote -= clockSkew; - _created = _lastEditedRemote; // NOTE: old models didn't have age or created time, assume their last edit was a create + memcpy(&_lastEdited, dataAt, sizeof(_lastEdited)); + dataAt += sizeof(_lastEdited); + bytesRead += sizeof(_lastEdited); + _lastEdited -= clockSkew; + _created = _lastEdited; // NOTE: old models didn't have age or created time, assume their last edit was a create QString ageAsString = formatSecondsElapsed(getAge()); qDebug() << "Loading old model file, _created = _lastEdited =" << _created