use updateFoo() where entity properties need relay

clear EntityItem updateFlags when processed
This commit is contained in:
Andrew Meadows 2014-11-19 15:12:22 -08:00
parent a183248f38
commit 97d1dc4200
5 changed files with 37 additions and 15 deletions

View file

@ -467,7 +467,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef
dataAt += propertyFlags.getEncodedLength(); dataAt += propertyFlags.getEncodedLength();
bytesRead += propertyFlags.getEncodedLength(); bytesRead += propertyFlags.getEncodedLength();
READ_ENTITY_PROPERTY(PROP_POSITION, glm::vec3, _position); READ_ENTITY_PROPERTY_SETTER(PROP_POSITION, glm::vec3, updatePosition);
// Old bitstreams had PROP_RADIUS, new bitstreams have PROP_DIMENSIONS // Old bitstreams had PROP_RADIUS, new bitstreams have PROP_DIMENSIONS
if (args.bitstreamVersion < VERSION_ENTITIES_SUPPORT_DIMENSIONS) { if (args.bitstreamVersion < VERSION_ENTITIES_SUPPORT_DIMENSIONS) {
@ -486,7 +486,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef
} }
} else { } else {
READ_ENTITY_PROPERTY(PROP_DIMENSIONS, glm::vec3, _dimensions); READ_ENTITY_PROPERTY_SETTER(PROP_DIMENSIONS, glm::vec3, setDimensions);
if (wantDebug) { if (wantDebug) {
qDebug() << " readEntityDataFromBuffer() NEW FORMAT... look for PROP_DIMENSIONS"; qDebug() << " readEntityDataFromBuffer() NEW FORMAT... look for PROP_DIMENSIONS";
} }
@ -496,19 +496,19 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef
qDebug() << " readEntityDataFromBuffer() _dimensions:" << getDimensionsInMeters() << " in meters"; qDebug() << " readEntityDataFromBuffer() _dimensions:" << getDimensionsInMeters() << " in meters";
} }
READ_ENTITY_PROPERTY_QUAT(PROP_ROTATION, _rotation); READ_ENTITY_PROPERTY_QUAT_SETTER(PROP_ROTATION, updateRotation);
READ_ENTITY_PROPERTY(PROP_MASS, float, _mass); READ_ENTITY_PROPERTY_SETTER(PROP_MASS, float, updateMass);
READ_ENTITY_PROPERTY(PROP_VELOCITY, glm::vec3, _velocity); READ_ENTITY_PROPERTY_SETTER(PROP_VELOCITY, glm::vec3, updateVelocity);
READ_ENTITY_PROPERTY(PROP_GRAVITY, glm::vec3, _gravity); READ_ENTITY_PROPERTY_SETTER(PROP_GRAVITY, glm::vec3, updateGravity);
READ_ENTITY_PROPERTY(PROP_DAMPING, float, _damping); READ_ENTITY_PROPERTY(PROP_DAMPING, float, _damping);
READ_ENTITY_PROPERTY(PROP_LIFETIME, float, _lifetime); READ_ENTITY_PROPERTY_SETTER(PROP_LIFETIME, float, updateLifetime);
READ_ENTITY_PROPERTY_STRING(PROP_SCRIPT,setScript); READ_ENTITY_PROPERTY_STRING(PROP_SCRIPT,setScript);
READ_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, glm::vec3, _registrationPoint); READ_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, glm::vec3, _registrationPoint);
READ_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, glm::vec3, _angularVelocity); READ_ENTITY_PROPERTY_SETTER(PROP_ANGULAR_VELOCITY, glm::vec3, updateAngularVelocity);
READ_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, float, _angularDamping); READ_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, float, _angularDamping);
READ_ENTITY_PROPERTY(PROP_VISIBLE, bool, _visible); READ_ENTITY_PROPERTY(PROP_VISIBLE, bool, _visible);
READ_ENTITY_PROPERTY(PROP_IGNORE_FOR_COLLISIONS, bool, _ignoreForCollisions); READ_ENTITY_PROPERTY_SETTER(PROP_IGNORE_FOR_COLLISIONS, bool, updateIgnoreForCollisions);
READ_ENTITY_PROPERTY(PROP_COLLISIONS_WILL_MOVE, bool, _collisionsWillMove); READ_ENTITY_PROPERTY_SETTER(PROP_COLLISIONS_WILL_MOVE, bool, updateCollisionsWillMove);
READ_ENTITY_PROPERTY(PROP_LOCKED, bool, _locked); READ_ENTITY_PROPERTY(PROP_LOCKED, bool, _locked);
READ_ENTITY_PROPERTY_STRING(PROP_USER_DATA,setUserData); READ_ENTITY_PROPERTY_STRING(PROP_USER_DATA,setUserData);
@ -1044,4 +1044,11 @@ void EntityItem::updateCollisionsWillMove(bool value) {
} }
} }
void EntityItem::updateLifetime(float value) {
if (_lifetime != value) {
_lifetime = value;
_updateFlags |= UPDATE_LIFETIME;
}
}

View file

@ -41,6 +41,7 @@ enum EntityUpdateFlags {
UPDATE_MASS = 0x0004, UPDATE_MASS = 0x0004,
UPDATE_COLLISION = 0x0008, UPDATE_COLLISION = 0x0008,
UPDATE_SHAPE = 0x0010, UPDATE_SHAPE = 0x0010,
UPDATE_LIFETIME = 0x0020
//UPDATE_APPEARANCE = 0x8000, //UPDATE_APPEARANCE = 0x8000,
}; };
@ -285,9 +286,10 @@ public:
void updateAngularVelocity(const glm::vec3& value); void updateAngularVelocity(const glm::vec3& value);
void updateIgnoreForCollisions(bool value); void updateIgnoreForCollisions(bool value);
void updateCollisionsWillMove(bool value); void updateCollisionsWillMove(bool value);
void updateLifetime(float value);
void setUpdateFlags(uint32_t mask) { _updateFlags |= mask; } uint32_t getUpdateFlags() const { return _updateFlags; }
void clearUpdateFlags(uint32_t mask) { _updateFlags &= ~mask; } void clearUpdateFlags() { _updateFlags = 0; }
#ifdef USE_BULLET_PHYSICS #ifdef USE_BULLET_PHYSICS
EntityMotionState* getMotionState() const { return _motionState; } EntityMotionState* getMotionState() const { return _motionState; }

View file

@ -63,6 +63,17 @@
} \ } \
} }
#define READ_ENTITY_PROPERTY_QUAT_SETTER(P,M) \
if (propertyFlags.getHasProperty(P)) { \
glm::quat fromBuffer; \
int bytes = unpackOrientationQuatFromBytes(dataAt, fromBuffer); \
dataAt += bytes; \
bytesRead += bytes; \
if (overwriteLocalData) { \
M(fromBuffer); \
} \
}
#define READ_ENTITY_PROPERTY_STRING(P,O) \ #define READ_ENTITY_PROPERTY_STRING(P,O) \
if (propertyFlags.getHasProperty(P)) { \ if (propertyFlags.getHasProperty(P)) { \
uint16_t length; \ uint16_t length; \

View file

@ -657,12 +657,13 @@ void EntityTree::updateChangedEntities(quint64 now, QSet<EntityItemID>& entities
foreach (EntityItem* thisEntity, _changedEntities) { foreach (EntityItem* thisEntity, _changedEntities) {
// check to see if the lifetime has expired, for immortal entities this is always false // check to see if the lifetime has expired, for immortal entities this is always false
if (thisEntity->lifetimeHasExpired()) { if (thisEntity->lifetimeHasExpired()) {
qDebug() << "Lifetime has expired for thisEntity:" << thisEntity->getEntityItemID(); qDebug() << "Lifetime has expired for entity:" << thisEntity->getEntityItemID();
entitiesToDelete << thisEntity->getEntityItemID(); entitiesToDelete << thisEntity->getEntityItemID();
clearEntityState(thisEntity); clearEntityState(thisEntity);
} else { } else {
updateEntityState(thisEntity); updateEntityState(thisEntity);
} }
thisEntity->clearUpdateFlags();
} }
_changedEntities.clear(); _changedEntities.clear();
} }

View file

@ -739,8 +739,9 @@ int EntityTreeElement::readElementDataFromBuffer(const unsigned char* data, int
EntityTreeElement* currentContainingElement = _myTree->getContainingElement(entityItemID); EntityTreeElement* currentContainingElement = _myTree->getContainingElement(entityItemID);
bytesForThisEntity = entityItem->readEntityDataFromBuffer(dataAt, bytesLeftToRead, args); bytesForThisEntity = entityItem->readEntityDataFromBuffer(dataAt, bytesLeftToRead, args);
// TODO: Andrew to only set changed if something has actually changed if (entityItem->getUpdateFlags()) {
_myTree->entityChanged(entityItem); _myTree->entityChanged(entityItem);
}
bool bestFitAfter = bestFitEntityBounds(entityItem); bool bestFitAfter = bestFitEntityBounds(entityItem);
if (bestFitBefore != bestFitAfter) { if (bestFitBefore != bestFitAfter) {