From 18d0cb5158f7d5ebd140060f25f6d82ffef1cec0 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 16 Jul 2015 17:48:28 -0700 Subject: [PATCH 1/5] cleanup of EntityItem ctors and friends --- libraries/entities/src/BoxEntityItem.cpp | 1 - libraries/entities/src/EntityItem.cpp | 8 ++------ libraries/entities/src/EntityItem.h | 1 - libraries/entities/src/LightEntityItem.cpp | 2 +- libraries/entities/src/LineEntityItem.cpp | 1 - libraries/entities/src/ModelEntityItem.cpp | 2 +- libraries/entities/src/ParticleEffectEntityItem.cpp | 2 +- libraries/entities/src/PolyVoxEntityItem.cpp | 1 - libraries/entities/src/SphereEntityItem.cpp | 2 +- libraries/entities/src/TextEntityItem.cpp | 1 - libraries/entities/src/WebEntityItem.cpp | 3 +-- libraries/entities/src/ZoneEntityItem.cpp | 1 - 12 files changed, 7 insertions(+), 18 deletions(-) diff --git a/libraries/entities/src/BoxEntityItem.cpp b/libraries/entities/src/BoxEntityItem.cpp index 291e350db0..ce05bd93f0 100644 --- a/libraries/entities/src/BoxEntityItem.cpp +++ b/libraries/entities/src/BoxEntityItem.cpp @@ -29,7 +29,6 @@ BoxEntityItem::BoxEntityItem(const EntityItemID& entityItemID, const EntityItemP EntityItem(entityItemID) { _type = EntityTypes::Box; - _created = properties.getCreated(); setProperties(properties); } diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 50b36ec6e2..935ca77376 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -85,11 +85,6 @@ EntityItem::EntityItem(const EntityItemID& entityItemID) : _lastUpdated = now; } -EntityItem::EntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : EntityItem(entityItemID) -{ - setProperties(properties); -} - EntityItem::~EntityItem() { // clear out any left-over actions EntityTree* entityTree = _element ? _element->getTree() : nullptr; @@ -1077,6 +1072,8 @@ void EntityItem::getAllTerseUpdateProperties(EntityItemProperties& properties) c bool EntityItem::setProperties(const EntityItemProperties& properties) { bool somethingChanged = false; + // just in case _created must be properly set before the rest we do it first + SET_ENTITY_PROPERTY_FROM_PROPERTIES(created, updateCreated); // these affect TerseUpdate properties SET_ENTITY_PROPERTY_FROM_PROPERTIES(simulationOwner, setSimulationOwner); @@ -1099,7 +1096,6 @@ bool EntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(friction, updateFriction); SET_ENTITY_PROPERTY_FROM_PROPERTIES(ignoreForCollisions, updateIgnoreForCollisions); SET_ENTITY_PROPERTY_FROM_PROPERTIES(collisionsWillMove, updateCollisionsWillMove); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(created, updateCreated); SET_ENTITY_PROPERTY_FROM_PROPERTIES(lifetime, updateLifetime); // non-simulation properties below diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index de431446e8..478c96a2f2 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -119,7 +119,6 @@ public: DONT_ALLOW_INSTANTIATION // This class can not be instantiated directly EntityItem(const EntityItemID& entityItemID); - EntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties); virtual ~EntityItem(); // ID and EntityItemID related methods diff --git a/libraries/entities/src/LightEntityItem.cpp b/libraries/entities/src/LightEntityItem.cpp index 5e765a0792..d67d09e4b1 100644 --- a/libraries/entities/src/LightEntityItem.cpp +++ b/libraries/entities/src/LightEntityItem.cpp @@ -29,7 +29,7 @@ EntityItemPointer LightEntityItem::factory(const EntityItemID& entityID, const E // our non-pure virtual subclass for now... LightEntityItem::LightEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : - EntityItem(entityItemID, properties) + EntityItem(entityItemID) { _type = EntityTypes::Light; diff --git a/libraries/entities/src/LineEntityItem.cpp b/libraries/entities/src/LineEntityItem.cpp index 067b1d8fee..222aee1a8f 100644 --- a/libraries/entities/src/LineEntityItem.cpp +++ b/libraries/entities/src/LineEntityItem.cpp @@ -38,7 +38,6 @@ LineEntityItem::LineEntityItem(const EntityItemID& entityItemID, const EntityIte _points(QVector(0)) { _type = EntityTypes::Line; - _created = properties.getCreated(); setProperties(properties); diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index b72dd5fab4..a5c52a32bf 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -33,7 +33,7 @@ EntityItemPointer ModelEntityItem::factory(const EntityItemID& entityID, const E } ModelEntityItem::ModelEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : - EntityItem(entityItemID, properties) + EntityItem(entityItemID) { _type = EntityTypes::Model; setProperties(properties); diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index 5c8a5b63a1..60c46b4cac 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -61,7 +61,7 @@ EntityItemPointer ParticleEffectEntityItem::factory(const EntityItemID& entityID // our non-pure virtual subclass for now... ParticleEffectEntityItem::ParticleEffectEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : - EntityItem(entityItemID, properties), + EntityItem(entityItemID), _maxParticles(DEFAULT_MAX_PARTICLES), _lifespan(DEFAULT_LIFESPAN), _emitRate(DEFAULT_EMIT_RATE), diff --git a/libraries/entities/src/PolyVoxEntityItem.cpp b/libraries/entities/src/PolyVoxEntityItem.cpp index 6f284caeaa..9657b1a8fe 100644 --- a/libraries/entities/src/PolyVoxEntityItem.cpp +++ b/libraries/entities/src/PolyVoxEntityItem.cpp @@ -57,7 +57,6 @@ PolyVoxEntityItem::PolyVoxEntityItem(const EntityItemID& entityItemID, const Ent _voxelSurfaceStyle(PolyVoxEntityItem::DEFAULT_VOXEL_SURFACE_STYLE) { _type = EntityTypes::PolyVox; - _created = properties.getCreated(); setProperties(properties); } diff --git a/libraries/entities/src/SphereEntityItem.cpp b/libraries/entities/src/SphereEntityItem.cpp index 2298035854..c77a513cfc 100644 --- a/libraries/entities/src/SphereEntityItem.cpp +++ b/libraries/entities/src/SphereEntityItem.cpp @@ -30,7 +30,7 @@ EntityItemPointer SphereEntityItem::factory(const EntityItemID& entityID, const // our non-pure virtual subclass for now... SphereEntityItem::SphereEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : - EntityItem(entityItemID, properties) + EntityItem(entityItemID) { _type = EntityTypes::Sphere; setProperties(properties); diff --git a/libraries/entities/src/TextEntityItem.cpp b/libraries/entities/src/TextEntityItem.cpp index 31ee9e6676..f4472642e4 100644 --- a/libraries/entities/src/TextEntityItem.cpp +++ b/libraries/entities/src/TextEntityItem.cpp @@ -37,7 +37,6 @@ TextEntityItem::TextEntityItem(const EntityItemID& entityItemID, const EntityIte EntityItem(entityItemID) { _type = EntityTypes::Text; - _created = properties.getCreated(); setProperties(properties); } diff --git a/libraries/entities/src/WebEntityItem.cpp b/libraries/entities/src/WebEntityItem.cpp index 4c849f5270..915fd8c00c 100644 --- a/libraries/entities/src/WebEntityItem.cpp +++ b/libraries/entities/src/WebEntityItem.cpp @@ -30,7 +30,6 @@ WebEntityItem::WebEntityItem(const EntityItemID& entityItemID, const EntityItemP EntityItem(entityItemID) { _type = EntityTypes::Web; - _created = properties.getCreated(); setProperties(properties); } @@ -149,4 +148,4 @@ void WebEntityItem::setSourceUrl(const QString& value) { } } -const QString& WebEntityItem::getSourceUrl() const { return _sourceUrl; } \ No newline at end of file +const QString& WebEntityItem::getSourceUrl() const { return _sourceUrl; } diff --git a/libraries/entities/src/ZoneEntityItem.cpp b/libraries/entities/src/ZoneEntityItem.cpp index 6f44223892..871e9b8cdd 100644 --- a/libraries/entities/src/ZoneEntityItem.cpp +++ b/libraries/entities/src/ZoneEntityItem.cpp @@ -37,7 +37,6 @@ ZoneEntityItem::ZoneEntityItem(const EntityItemID& entityItemID, const EntityIte EntityItem(entityItemID) { _type = EntityTypes::Zone; - _created = properties.getCreated(); _keyLightColor[RED_INDEX] = DEFAULT_KEYLIGHT_COLOR.red; _keyLightColor[GREEN_INDEX] = DEFAULT_KEYLIGHT_COLOR.green; From 2441be21e29175518c41e056690cfad3131ec0aa Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 16 Jul 2015 20:58:34 -0700 Subject: [PATCH 2/5] restore order of setting properties --- libraries/entities/src/EntityItem.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 935ca77376..17dae38075 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1072,8 +1072,6 @@ void EntityItem::getAllTerseUpdateProperties(EntityItemProperties& properties) c bool EntityItem::setProperties(const EntityItemProperties& properties) { bool somethingChanged = false; - // just in case _created must be properly set before the rest we do it first - SET_ENTITY_PROPERTY_FROM_PROPERTIES(created, updateCreated); // these affect TerseUpdate properties SET_ENTITY_PROPERTY_FROM_PROPERTIES(simulationOwner, setSimulationOwner); @@ -1096,6 +1094,7 @@ bool EntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(friction, updateFriction); SET_ENTITY_PROPERTY_FROM_PROPERTIES(ignoreForCollisions, updateIgnoreForCollisions); SET_ENTITY_PROPERTY_FROM_PROPERTIES(collisionsWillMove, updateCollisionsWillMove); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(created, updateCreated); SET_ENTITY_PROPERTY_FROM_PROPERTIES(lifetime, updateLifetime); // non-simulation properties below From f09b3eb736243897dc6a07f9e7b2f077ca1d35b2 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 17 Jul 2015 12:14:07 -0700 Subject: [PATCH 3/5] set creation time when loading unknown timestamp --- libraries/entities/src/EntityTreeElement.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index 41c0529b80..856550f297 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -772,6 +772,9 @@ int EntityTreeElement::readElementDataFromBuffer(const unsigned char* data, int entityItemID = entityItem->getEntityItemID(); _myTree->setContainingElement(entityItemID, this); _myTree->postAddEntity(entityItem); + if (entityItem->getCreated() == UNKNOWN_CREATED_TIME) { + entityItem->recordCreationTime(); + } } } // Move the buffer forward to read more entities From 1c7afbda04d2ff4032a6ffb73133c44c8be9bc5d Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 17 Jul 2015 12:14:53 -0700 Subject: [PATCH 4/5] workaround for bad sphere radius --- .../entities-renderer/src/RenderableSphereEntityItem.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp b/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp index 6d9cb525d6..ea25f748af 100644 --- a/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp @@ -39,7 +39,15 @@ void RenderableSphereEntityItem::render(RenderArgs* args) { Q_ASSERT(args->_batch); gpu::Batch& batch = *args->_batch; +#define USE_MAGIC_WORKAROUND +#ifdef USE_MAGIC_WORKAROUND + // It's a mystery how this actually works! + Transform transform = getTransformToCenter(); + transform.setScale(transform.getScale()); + batch.setModelTransform(transform); // use a transform with scale, rotation, registration point and translation +#else // USE_MAGIC_WORKAROUND batch.setModelTransform(getTransformToCenter()); // use a transform with scale, rotation, registration point and translation +#endif // USE_MAGIC_WORKAROUND DependencyManager::get()->renderSolidSphere(batch, 0.5f, SLICES, STACKS, sphereColor); RenderableDebugableEntityItem::render(this, args); From 32b1fe0918f4755d5f5d6720d908f0bab0232029 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 17 Jul 2015 15:21:02 -0700 Subject: [PATCH 5/5] proper fix for incorrect render of scaled entities --- .../entities-renderer/src/RenderableSphereEntityItem.cpp | 8 -------- libraries/entities/src/EntityItem.cpp | 8 +++++--- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp b/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp index ea25f748af..6d9cb525d6 100644 --- a/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp @@ -39,15 +39,7 @@ void RenderableSphereEntityItem::render(RenderArgs* args) { Q_ASSERT(args->_batch); gpu::Batch& batch = *args->_batch; -#define USE_MAGIC_WORKAROUND -#ifdef USE_MAGIC_WORKAROUND - // It's a mystery how this actually works! - Transform transform = getTransformToCenter(); - transform.setScale(transform.getScale()); - batch.setModelTransform(transform); // use a transform with scale, rotation, registration point and translation -#else // USE_MAGIC_WORKAROUND batch.setModelTransform(getTransformToCenter()); // use a transform with scale, rotation, registration point and translation -#endif // USE_MAGIC_WORKAROUND DependencyManager::get()->renderSolidSphere(batch, 0.5f, SLICES, STACKS, sphereColor); RenderableDebugableEntityItem::render(this, args); diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 17dae38075..9dec62b0c0 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -45,9 +45,7 @@ EntityItem::EntityItem(const EntityItemID& entityItemID) : _lastEditedFromRemoteInRemoteTime(0), _created(UNKNOWN_CREATED_TIME), _changedOnServer(0), - _transform(ENTITY_ITEM_DEFAULT_ROTATION, - ENTITY_ITEM_DEFAULT_DIMENSIONS, - ENTITY_ITEM_DEFAULT_POSITION), + _transform(), _glowLevel(ENTITY_ITEM_DEFAULT_GLOW_LEVEL), _localRenderAlpha(ENTITY_ITEM_DEFAULT_LOCAL_RENDER_ALPHA), _density(ENTITY_ITEM_DEFAULT_DENSITY), @@ -80,6 +78,10 @@ EntityItem::EntityItem(const EntityItemID& entityItemID) : _physicsInfo(nullptr), _simulated(false) { + // explicitly set transform parts to set dirty flags used by batch rendering + _transform.setTranslation(ENTITY_ITEM_DEFAULT_POSITION); + _transform.setRotation(ENTITY_ITEM_DEFAULT_ROTATION); + _transform.setScale(ENTITY_ITEM_DEFAULT_DIMENSIONS); quint64 now = usecTimestampNow(); _lastSimulated = now; _lastUpdated = now;