From 8c9cf480f3428b4e1932e49c65507045512d0bce Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 27 May 2015 13:23:59 -0700 Subject: [PATCH] more hacking --- .../src/EntityTreeRenderer.cpp | 35 +++++++++++++++++++ .../src/EntityTreeRenderer.h | 1 + .../src/RenderableEntityItem.cpp | 26 ++++++++------ .../src/RenderableEntityItem.h | 7 ++-- .../src/AbstractViewStateInterface.h | 7 ++++ libraries/render/src/render/DrawTask.cpp | 3 ++ libraries/render/src/render/Scene.cpp | 4 +++ 7 files changed, 71 insertions(+), 12 deletions(-) diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 217597dfe1..4915eac8fe 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -29,8 +29,11 @@ #include #include + #include "EntityTreeRenderer.h" +#include "RenderableEntityItem.h" + #include "RenderableBoxEntityItem.h" #include "RenderableLightEntityItem.h" #include "RenderableModelEntityItem.h" @@ -92,6 +95,9 @@ void EntityTreeRenderer::clear() { } OctreeRenderer::clear(); _entityScripts.clear(); + + qDebug() << "EntityTreeRenderer::clear() need to clear the scene... _viewState->getMain3DScene():" << _viewState->getMain3DScene().get(); + } void EntityTreeRenderer::init() { @@ -1048,10 +1054,39 @@ void EntityTreeRenderer::deletingEntity(const EntityItemID& entityID) { checkAndCallUnload(entityID); } _entityScripts.remove(entityID); + + // here's where we remove the entity payload from the scene + qDebug() << "deletingEntity() entityID:" << entityID << "_viewState->getMain3DScene():" << _viewState->getMain3DScene().get(); + + render::Scene::PendingChanges pendingChanges; + if (_entityToSceneItems.contains(entityID)) { + render::ItemID renderItem = _entityToSceneItems[entityID]; + pendingChanges.removeItem(renderItem); + _viewState->getMain3DScene()->enqueuePendingChanges(pendingChanges); + } } void EntityTreeRenderer::addingEntity(const EntityItemID& entityID) { checkAndCallPreload(entityID); + + // here's where we add the entity payload to the scene + qDebug() << "addingEntity() entityID:" << entityID << "_viewState->getMain3DScene():" << _viewState->getMain3DScene().get(); + + render::Scene::PendingChanges pendingChanges; + render::ItemID renderItem = _viewState->getMain3DScene()->allocateID(); + _entityToSceneItems[entityID] = renderItem; + EntityItemPointer entity = static_cast(_tree)->findEntityByID(entityID); + + auto renderData = RenderableEntityItem::Pointer(new RenderableEntityItem(entity)); + auto renderPayload = render::PayloadPointer(new RenderableEntityItem::Payload(renderData)); + + qDebug() << " renderItem:" << renderItem; + qDebug() << " renderPayload:" << renderPayload.get(); + + pendingChanges.resetItem(renderItem, renderPayload); + + _viewState->getMain3DScene()->enqueuePendingChanges(pendingChanges); + _viewState->getMain3DScene()->processPendingChangesQueue(); } void EntityTreeRenderer::entitySciptChanging(const EntityItemID& entityID) { diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.h b/libraries/entities-renderer/src/EntityTreeRenderer.h index fc6466a6c5..22d6703069 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.h +++ b/libraries/entities-renderer/src/EntityTreeRenderer.h @@ -187,6 +187,7 @@ private: float _previousStageHour; int _previousStageDay; + QHash _entityToSceneItems; }; diff --git a/libraries/entities-renderer/src/RenderableEntityItem.cpp b/libraries/entities-renderer/src/RenderableEntityItem.cpp index 83df213a96..d37eb4cff8 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableEntityItem.cpp @@ -12,24 +12,30 @@ #include "RenderableEntityItem.h" -// For Ubuntu, the compiler want's the Payload's functions to be specialized in the "render" namespace explicitely... namespace render { - template <> const ItemKey payloadGetKey(const RenderableEntityItem::Pointer& entity) { - return ItemKey::Builder::opaqueShape(); + template <> const ItemKey payloadGetKey(const RenderableEntityItem::Pointer& payload) { + qDebug() << "payloadGetKey()... for payload:" << payload.get(); + ItemKey key = ItemKey::Builder::opaqueShape(); + qDebug() << " key.isOpaque():" << key.isOpaque(); + return key; } - template <> const Item::Bound payloadGetBound(const RenderableEntityItem::Pointer& entity) { - if (entity) { - return entity->getAABox(); + template <> const Item::Bound payloadGetBound(const RenderableEntityItem::Pointer& payload) { + qDebug() << "payloadGetBound()... for payload:" << payload.get(); + if (payload && payload->entity) { + return payload->entity->getAABox(); } return render::Item::Bound(); } - - template <> void payloadRender(const RenderableEntityItem::Pointer& entity, RenderArgs* args) { + template <> void payloadRender(const RenderableEntityItem::Pointer& payload, RenderArgs* args) { + qDebug() << "payloadRender()... for payload:" << payload.get(); if (args) { + qDebug() << "rendering payload!! for payload:" << payload.get(); + qDebug() << "rendering payload!! for entity:" << payload->entity.get(); args->_elementsTouched++; - if (entity) { - entity->render(args); + if (payload && payload->entity) { + qDebug() << "rendering payload!! for entity:" << payload->entity->getEntityItemID(); + payload->entity->render(args); } } } diff --git a/libraries/entities-renderer/src/RenderableEntityItem.h b/libraries/entities-renderer/src/RenderableEntityItem.h index 658f78ed47..2c81a31f6e 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.h +++ b/libraries/entities-renderer/src/RenderableEntityItem.h @@ -15,11 +15,14 @@ #include #include + class RenderableEntityItem { public: + RenderableEntityItem(EntityItemPointer entity) : entity(entity) { } typedef render::Payload Payload; - typedef std::shared_ptr PayloadPointer; - typedef EntityItemPointer Pointer; + typedef Payload::DataPointer Pointer; + + EntityItemPointer entity; }; #endif // hifi_RenderableEntityItem_h diff --git a/libraries/render-utils/src/AbstractViewStateInterface.h b/libraries/render-utils/src/AbstractViewStateInterface.h index a1447293b7..ff417da85e 100644 --- a/libraries/render-utils/src/AbstractViewStateInterface.h +++ b/libraries/render-utils/src/AbstractViewStateInterface.h @@ -15,6 +15,9 @@ #include #include +#include +#include + #include class Transform; @@ -60,6 +63,10 @@ public: virtual void postLambdaEvent(std::function f) = 0; virtual qreal getDevicePixelRatio() = 0; + virtual render::ScenePointer getMain3DScene() = 0; + virtual render::EnginePointer getRenderEngine() = 0; + + // FIXME - we shouldn't assume that there's a single instance of an AbstractViewStateInterface static AbstractViewStateInterface* instance(); static void setInstance(AbstractViewStateInterface* instance); }; diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index 688fa31fe1..fa5512cb70 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -31,9 +31,12 @@ void DrawSceneTask::run(const SceneContextPointer& sceneContext, const RenderCon // render opaques auto filter = ItemFilter::Builder::opaqueShape(); auto& opaqueShapeItems = itemBucketMap.at(filter); + + qDebug() << "DrawSceneTask::run()"; for (auto id : opaqueShapeItems) { auto item = scene->getItem(id); + qDebug() << " id:" << id; item.render(args); } }; diff --git a/libraries/render/src/render/Scene.cpp b/libraries/render/src/render/Scene.cpp index 8f9c5906ca..8da3119de1 100644 --- a/libraries/render/src/render/Scene.cpp +++ b/libraries/render/src/render/Scene.cpp @@ -115,6 +115,7 @@ void consolidateChangeQueue(Scene::PendingChangesQueue& queue, Scene::PendingCha } void Scene::processPendingChangesQueue() { + qDebug() << "Scene::processPendingChangesQueue()..."; _changeQueueMutex.lock(); PendingChanges consolidatedPendingChanges; consolidateChangeQueue(_changeQueue, consolidatedPendingChanges); @@ -138,9 +139,12 @@ void Scene::processPendingChangesQueue() { } void Scene::resetItems(const ItemIDs& ids, Payloads& payloads) { + qDebug() << "Scene::resetItems()..."; auto resetID = ids.begin(); auto resetPayload = payloads.begin(); for (;resetID != ids.end(); resetID++, resetPayload++) { + qDebug() << " resetID:" << *resetID; + auto& item = _items[(*resetID)]; auto oldKey = item.getKey(); item.resetPayload(*resetPayload);