From 5ad9efbee434539cff2e6b500b44abde9a6bbaa1 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 27 May 2015 20:42:53 -0700 Subject: [PATCH] allow entities to tell us if they support proper scene rendering --- .../src/EntityTreeRenderer.cpp | 34 ++++++++++++------- .../src/RenderableLightEntityItem.h | 1 + .../src/RenderableModelEntityItem.h | 1 + .../src/RenderableTextEntityItem.h | 1 + .../src/RenderableWebEntityItem.h | 1 + libraries/entities/src/EntityItem.h | 1 + 6 files changed, 26 insertions(+), 13 deletions(-) diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index b59ea7e7af..9818657c5a 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -96,9 +96,16 @@ void EntityTreeRenderer::clear() { OctreeRenderer::clear(); _entityScripts.clear(); - // TODO/FIXME - this needs to be fixed... we need to clear all items out of the scene in this case. qDebug() << "EntityTreeRenderer::clear() need to clear the scene... "; - + render::Scene::PendingChanges pendingChanges; + QHashIterator i(_entityToSceneItems); + while (i.hasNext()) { + i.next(); + render::ItemID renderItem = i.value(); + pendingChanges.removeItem(renderItem); + } + _entityToSceneItems.clear(); + _viewState->getMain3DScene()->enqueuePendingChanges(pendingChanges); } void EntityTreeRenderer::init() { @@ -704,8 +711,8 @@ void EntityTreeRenderer::renderElement(OctreeElement* element, RenderArgs* args) } } - // hack for models. :( - if (entityItem->getType() == EntityTypes::Model) { + // hack for models and other entities that don't yet play well with others. :( + if (!entityItem->canRenderInScene()) { // render entityItem AABox entityBox = entityItem->getAABox(); @@ -1076,19 +1083,20 @@ void EntityTreeRenderer::addingEntity(const EntityItemID& entityID) { checkAndCallPreload(entityID); // here's where we add the entity payload to the scene - - render::Scene::PendingChanges pendingChanges; - render::ItemID renderItem = _viewState->getMain3DScene()->allocateID(); - _entityToSceneItems[entityID] = renderItem; EntityItemPointer entity = static_cast(_tree)->findEntityByID(entityID); + if (entity->canRenderInScene()) { + render::Scene::PendingChanges pendingChanges; + render::ItemID renderItem = _viewState->getMain3DScene()->allocateID(); + _entityToSceneItems[entityID] = renderItem; - auto renderData = RenderableEntityItem::Pointer(new RenderableEntityItem(entity)); - auto renderPayload = render::PayloadPointer(new RenderableEntityItem::Payload(renderData)); + auto renderData = RenderableEntityItem::Pointer(new RenderableEntityItem(entity)); + auto renderPayload = render::PayloadPointer(new RenderableEntityItem::Payload(renderData)); - pendingChanges.resetItem(renderItem, renderPayload); + pendingChanges.resetItem(renderItem, renderPayload); - _viewState->getMain3DScene()->enqueuePendingChanges(pendingChanges); - _viewState->getMain3DScene()->processPendingChangesQueue(); + _viewState->getMain3DScene()->enqueuePendingChanges(pendingChanges); + _viewState->getMain3DScene()->processPendingChangesQueue(); + } } void EntityTreeRenderer::entitySciptChanging(const EntityItemID& entityID) { diff --git a/libraries/entities-renderer/src/RenderableLightEntityItem.h b/libraries/entities-renderer/src/RenderableLightEntityItem.h index 427557432c..a90bb0baad 100644 --- a/libraries/entities-renderer/src/RenderableLightEntityItem.h +++ b/libraries/entities-renderer/src/RenderableLightEntityItem.h @@ -22,6 +22,7 @@ public: LightEntityItem(entityItemID, properties) { } + virtual bool canRenderInScene() { return false; } // we don't yet play well with others virtual void render(RenderArgs* args); virtual bool supportsDetailedRayIntersection() const { return true; } virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.h b/libraries/entities-renderer/src/RenderableModelEntityItem.h index f504019e67..335f3a4d25 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.h +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.h @@ -43,6 +43,7 @@ public: virtual void somethingChangedNotification() { _needsInitialSimulation = true; } + virtual bool canRenderInScene() { return false; } // we don't yet play well with others virtual void render(RenderArgs* args); virtual bool supportsDetailedRayIntersection() const { return true; } virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, diff --git a/libraries/entities-renderer/src/RenderableTextEntityItem.h b/libraries/entities-renderer/src/RenderableTextEntityItem.h index aa761461ac..eb2cfc16f1 100644 --- a/libraries/entities-renderer/src/RenderableTextEntityItem.h +++ b/libraries/entities-renderer/src/RenderableTextEntityItem.h @@ -27,6 +27,7 @@ public: ~RenderableTextEntityItem() { delete _textRenderer; } virtual void render(RenderArgs* args); + virtual bool canRenderInScene() { return false; } // we don't yet play well with others private: TextRenderer* _textRenderer = TextRenderer::getInstance(SANS_FONT_FAMILY, FIXED_FONT_POINT_SIZE / 2.0f); diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.h b/libraries/entities-renderer/src/RenderableWebEntityItem.h index 8dad2a0855..2ad4d799b6 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.h +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.h @@ -24,6 +24,7 @@ public: virtual void render(RenderArgs* args); virtual void setSourceUrl(const QString& value); + virtual bool canRenderInScene() { return false; } // we don't yet play well with others private: OffscreenQmlSurface* _webSurface{ nullptr }; diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 8f88b6de07..ed59a347af 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -151,6 +151,7 @@ public: EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { return 0; } + virtual bool canRenderInScene() { return true; } // does your entity property render using Render Items and Payloads virtual void render(RenderArgs* args) { } // by default entity items don't know how to render static int expectedBytes();