From 0d9f0f609b3ca89fde62866684bf7cfcdaed6b9f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 21 May 2015 16:22:23 -0700 Subject: [PATCH 01/10] first cut at RenderableEnitityItem payload --- libraries/entities-renderer/CMakeLists.txt | 2 +- .../src/EntityTreeRenderer.cpp | 13 +++++++++ .../src/EntityTreeRenderer.h | 29 +++++++++++++++++++ libraries/render/src/render/Scene.h | 1 + 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/libraries/entities-renderer/CMakeLists.txt b/libraries/entities-renderer/CMakeLists.txt index 6c7fa04a21..6a45b85271 100644 --- a/libraries/entities-renderer/CMakeLists.txt +++ b/libraries/entities-renderer/CMakeLists.txt @@ -12,4 +12,4 @@ find_package(Bullet REQUIRED) target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${BULLET_INCLUDE_DIRS}) target_link_libraries(${TARGET_NAME} ${BULLET_LIBRARIES}) -link_hifi_libraries(shared gpu script-engine render-utils) +link_hifi_libraries(shared gpu script-engine render render-utils) diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 23160be045..29d5bc7b11 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -1190,3 +1190,16 @@ void EntityTreeRenderer::entityCollisionWithEntity(const EntityItemID& idA, cons } } +template <> const render::Item::Key render::payloadGetKey(const RenderableEnitityItem* payload) { + return payload->getKey(); +} + +template <> const render::Item::Bound render::payloadGetBound(const RenderableEnitityItem* payload) { + return payload->getBounds(); +} + +template <> void render::payloadRender(const RenderableEnitityItem* payload, Context& context, RenderArgs* args) { + return payload->render(context, args); +} + + diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.h b/libraries/entities-renderer/src/EntityTreeRenderer.h index c42c628f57..943a555b17 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.h +++ b/libraries/entities-renderer/src/EntityTreeRenderer.h @@ -19,6 +19,7 @@ #include // for RayToEntityIntersectionResult #include #include +#include #include #include @@ -190,4 +191,32 @@ private: }; +class RenderableEnitityItem { +public: + RenderableEnitityItem(EntityItem* entity) { + _entity = entity; + } + + const render::Item::Key& getKey() const { + _myKey.set(render::Item::TYPE_SHAPE); + return _myKey; + } + + const render::Item::Bound getBounds() const { + return _entity->getAABox(); + } + + void render(render::Context& context, RenderArgs* args) const { + _entity->render(args); + } + +private: + mutable render::Item::Key _myKey; + EntityItem* _entity = nullptr; +}; + +typedef render::Payload RenderableEnitityItemPayload; + + + #endif // hifi_EntityTreeRenderer_h diff --git a/libraries/render/src/render/Scene.h b/libraries/render/src/render/Scene.h index 29aa061a9d..55ae1045d6 100644 --- a/libraries/render/src/render/Scene.h +++ b/libraries/render/src/render/Scene.h @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include From 4bdeef76108e60d0bcb751a8d6e847ee809f9844 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 22 May 2015 14:54:30 -0700 Subject: [PATCH 02/10] checkpoint --- .../src/EntityTreeRenderer.cpp | 14 ---- .../src/EntityTreeRenderer.h | 27 ------- .../src/RenderableEntityItem.cpp | 30 ++++++++ .../src/RenderableEntityItem.h | 76 +++++++++++++++++++ libraries/entities/src/EntityItem.h | 3 + libraries/render/src/render/Scene.h | 2 - 6 files changed, 109 insertions(+), 43 deletions(-) create mode 100644 libraries/entities-renderer/src/RenderableEntityItem.cpp create mode 100644 libraries/entities-renderer/src/RenderableEntityItem.h diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 29d5bc7b11..02ace4fd0b 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -1189,17 +1189,3 @@ void EntityTreeRenderer::entityCollisionWithEntity(const EntityItemID& idA, cons entityScriptB.property("collisionWithEntity").call(entityScriptA, args); } } - -template <> const render::Item::Key render::payloadGetKey(const RenderableEnitityItem* payload) { - return payload->getKey(); -} - -template <> const render::Item::Bound render::payloadGetBound(const RenderableEnitityItem* payload) { - return payload->getBounds(); -} - -template <> void render::payloadRender(const RenderableEnitityItem* payload, Context& context, RenderArgs* args) { - return payload->render(context, args); -} - - diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.h b/libraries/entities-renderer/src/EntityTreeRenderer.h index 943a555b17..fa78b1dab1 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.h +++ b/libraries/entities-renderer/src/EntityTreeRenderer.h @@ -191,32 +191,5 @@ private: }; -class RenderableEnitityItem { -public: - RenderableEnitityItem(EntityItem* entity) { - _entity = entity; - } - - const render::Item::Key& getKey() const { - _myKey.set(render::Item::TYPE_SHAPE); - return _myKey; - } - - const render::Item::Bound getBounds() const { - return _entity->getAABox(); - } - - void render(render::Context& context, RenderArgs* args) const { - _entity->render(args); - } - -private: - mutable render::Item::Key _myKey; - EntityItem* _entity = nullptr; -}; - -typedef render::Payload RenderableEnitityItemPayload; - - #endif // hifi_EntityTreeRenderer_h diff --git a/libraries/entities-renderer/src/RenderableEntityItem.cpp b/libraries/entities-renderer/src/RenderableEntityItem.cpp new file mode 100644 index 0000000000..db77261b2f --- /dev/null +++ b/libraries/entities-renderer/src/RenderableEntityItem.cpp @@ -0,0 +1,30 @@ +// +// RenderableEntityItem.cpp +// interface/src +// +// Created by Brad Hefta-Gaub on 12/6/13. +// Copyright 2013 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + + +#include "RenderableEntityItem.h" + +/* + +template <> const render::ItemKey render::payloadGetKey(const std::shared_ptr& payload) { + return payload->getKey(); +} + +template <> const render::Item::Bound render::payloadGetBound(const std::shared_ptr& payload) { + return payload->getBounds(); +} + +template <> void render::payloadRender(const std::shared_ptr& payload, RenderArgs* args) { + return payload->render(args); +} + + +*/ \ No newline at end of file diff --git a/libraries/entities-renderer/src/RenderableEntityItem.h b/libraries/entities-renderer/src/RenderableEntityItem.h new file mode 100644 index 0000000000..f9b678e687 --- /dev/null +++ b/libraries/entities-renderer/src/RenderableEntityItem.h @@ -0,0 +1,76 @@ +// +// RenderableEntityItem.h +// interface/src +// +// Created by Brad Hefta-Gaub on 12/6/13. +// Copyright 2013 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_RenderableEntityItem_h +#define hifi_RenderableEntityItem_h + +/* + +#include +#include + +class RenderableEntityItemProxy { +public: + RenderableEntityItemProxy(EntityItem* entity) { + _entity = entity; + } + + const render::ItemKey& getKey() const { + _myKey = render::ItemKey::Builder().withTypeShape().build(); + return _myKey; + } + + const render::Item::Bound getBounds() const { + if (_entity) { + return _entity->getAABox(); + } + return render::Item::Bound(); + } + + void render(RenderArgs* args) const { + if (_entity) { + _entity->render(args); + } + } + + void clearEntity() { + _entity = nullptr; + } + +private: + mutable render::ItemKey _myKey; + EntityItem* _entity = nullptr; +}; + +typedef render::Payload RenderableEntityItemProxyPayload; + +class RenderableEntityItem { +public: + ~RenderableEntityItem() { + if (_proxy) { + _proxy->clearEntity(); + } + } + + RenderableEntityItemProxy* getRenderProxy() { + if (!_proxy) { + //_proxy = new RenderableEntityItemProxy(this); + } + return _proxy; + } +private: + RenderableEntityItemProxy* _proxy = nullptr; +}; + +*/ + + +#endif // hifi_RenderableEntityItem_h diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 8f88b6de07..f2806b105a 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -424,4 +424,7 @@ protected: bool _simulated; // set by EntitySimulation }; +typedef std::shared_ptr EntityItemSharedPointer; + + #endif // hifi_EntityItem_h diff --git a/libraries/render/src/render/Scene.h b/libraries/render/src/render/Scene.h index 55ae1045d6..c85e5f8a41 100644 --- a/libraries/render/src/render/Scene.h +++ b/libraries/render/src/render/Scene.h @@ -106,8 +106,6 @@ public: } }; -class RenderArgs; - class Item { public: typedef std::vector Vector; From 0799670215fe57454f2d042093bd78b35feab179 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 26 May 2015 16:27:00 -0700 Subject: [PATCH 03/10] simple entity payload --- .../src/RenderableEntityItem.cpp | 36 ++++++----- .../src/RenderableEntityItem.h | 59 ++----------------- libraries/entities/src/EntityItem.h | 3 - 3 files changed, 26 insertions(+), 72 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableEntityItem.cpp b/libraries/entities-renderer/src/RenderableEntityItem.cpp index db77261b2f..83df213a96 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableEntityItem.cpp @@ -12,19 +12,25 @@ #include "RenderableEntityItem.h" -/* - -template <> const render::ItemKey render::payloadGetKey(const std::shared_ptr& payload) { - return payload->getKey(); +// 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 Item::Bound payloadGetBound(const RenderableEntityItem::Pointer& entity) { + if (entity) { + return entity->getAABox(); + } + return render::Item::Bound(); + } + + template <> void payloadRender(const RenderableEntityItem::Pointer& entity, RenderArgs* args) { + if (args) { + args->_elementsTouched++; + if (entity) { + entity->render(args); + } + } + } } - -template <> const render::Item::Bound render::payloadGetBound(const std::shared_ptr& payload) { - return payload->getBounds(); -} - -template <> void render::payloadRender(const std::shared_ptr& payload, RenderArgs* args) { - return payload->render(args); -} - - -*/ \ No newline at end of file diff --git a/libraries/entities-renderer/src/RenderableEntityItem.h b/libraries/entities-renderer/src/RenderableEntityItem.h index f9b678e687..5f63fe84c2 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.h +++ b/libraries/entities-renderer/src/RenderableEntityItem.h @@ -12,65 +12,16 @@ #ifndef hifi_RenderableEntityItem_h #define hifi_RenderableEntityItem_h -/* - #include #include -class RenderableEntityItemProxy { -public: - RenderableEntityItemProxy(EntityItem* entity) { - _entity = entity; - } - - const render::ItemKey& getKey() const { - _myKey = render::ItemKey::Builder().withTypeShape().build(); - return _myKey; - } - - const render::Item::Bound getBounds() const { - if (_entity) { - return _entity->getAABox(); - } - return render::Item::Bound(); - } - - void render(RenderArgs* args) const { - if (_entity) { - _entity->render(args); - } - } - - void clearEntity() { - _entity = nullptr; - } - -private: - mutable render::ItemKey _myKey; - EntityItem* _entity = nullptr; -}; - -typedef render::Payload RenderableEntityItemProxyPayload; - class RenderableEntityItem { public: - ~RenderableEntityItem() { - if (_proxy) { - _proxy->clearEntity(); - } - } - - RenderableEntityItemProxy* getRenderProxy() { - if (!_proxy) { - //_proxy = new RenderableEntityItemProxy(this); - } - return _proxy; - } -private: - RenderableEntityItemProxy* _proxy = nullptr; + typedef render::Payload Payload; + typedef std::shared_ptr PayloadPointer; + //typedef Payload::DataPointer Pointer; + typedef EntityItemPointer Pointer; + }; -*/ - - #endif // hifi_RenderableEntityItem_h diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index f2806b105a..8f88b6de07 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -424,7 +424,4 @@ protected: bool _simulated; // set by EntitySimulation }; -typedef std::shared_ptr EntityItemSharedPointer; - - #endif // hifi_EntityItem_h From 2f6a3a61d78c0b12bfe8405dfd258a945cdf8257 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 26 May 2015 16:31:15 -0700 Subject: [PATCH 04/10] reorder headers to match coding standard --- libraries/render/src/render/Scene.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/libraries/render/src/render/Scene.h b/libraries/render/src/render/Scene.h index a3eab29a86..bb117fbcee 100644 --- a/libraries/render/src/render/Scene.h +++ b/libraries/render/src/render/Scene.h @@ -12,17 +12,17 @@ #ifndef hifi_render_Scene_h #define hifi_render_Scene_h -#include -#include -#include -#include -#include -#include -#include -#include #include +#include +#include +#include #include #include +#include +#include + +#include +#include namespace render { From 2516066e1dc0e15502acdade327b7287aeeb6280 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 27 May 2015 10:40:07 -0700 Subject: [PATCH 05/10] some hacking --- interface/src/Application.h | 3 +++ libraries/entities-renderer/src/RenderableEntityItem.h | 2 -- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.h b/interface/src/Application.h index 79a75eef43..fb262ad2aa 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -348,6 +348,9 @@ public: void setMaxOctreePacketsPerSecond(int maxOctreePPS); int getMaxOctreePacketsPerSecond(); + + render::ScenePointer getMain3DScene() { return _main3DScene; } + render::EnginePointer getRenderEngine() { return _renderEngine; } signals: diff --git a/libraries/entities-renderer/src/RenderableEntityItem.h b/libraries/entities-renderer/src/RenderableEntityItem.h index 5f63fe84c2..658f78ed47 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.h +++ b/libraries/entities-renderer/src/RenderableEntityItem.h @@ -19,9 +19,7 @@ class RenderableEntityItem { public: typedef render::Payload Payload; typedef std::shared_ptr PayloadPointer; - //typedef Payload::DataPointer Pointer; typedef EntityItemPointer Pointer; - }; #endif // hifi_RenderableEntityItem_h From 8c9cf480f3428b4e1932e49c65507045512d0bce Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 27 May 2015 13:23:59 -0700 Subject: [PATCH 06/10] 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); From 61712a6ac3425ca056b9a711a6a24f31bbd13aa3 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 27 May 2015 15:29:35 -0700 Subject: [PATCH 07/10] add some debugging streamers for some scene classes --- libraries/render/src/render/Scene.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/libraries/render/src/render/Scene.h b/libraries/render/src/render/Scene.h index 6c78dbc3ad..c7d112e74b 100644 --- a/libraries/render/src/render/Scene.h +++ b/libraries/render/src/render/Scene.h @@ -94,6 +94,13 @@ public: bool isPickable() const { return _flags[PICKABLE]; } }; +inline QDebug operator<<(QDebug debug, const ItemKey& itemKey) { + debug << "[ItemKey: isOpaque:" << itemKey.isOpaque() + << ", isStatic:" << itemKey.isStatic() + << ", isWorldSpace:" << itemKey.isWorldSpace() + << "]"; + return debug; +} class ItemFilter { public: @@ -154,6 +161,12 @@ public: }; }; +inline QDebug operator<<(QDebug debug, const ItemFilter& me) { + debug << "[ItemFilter: opaqueShape:" << me.test(ItemKey::Builder::opaqueShape()) + << "]"; + return debug; +} + class Item { public: typedef std::vector Vector; @@ -203,6 +216,12 @@ protected: friend class Scene; }; +inline QDebug operator<<(QDebug debug, const Item& item) { + debug << "[Item: _key:" << item.getKey() << ", bounds:" << item.getBound() << "]"; + return debug; +} + + // THe Payload class is the real Payload to be used // THis allow anything to be turned into a Payload as long as the required interface functions are available // When creating a new kind of payload from a new "stuff" class then you need to create specialized version for "stuff" From a56e0d80b63700a172d5241f3365f773b319ded6 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 27 May 2015 15:30:55 -0700 Subject: [PATCH 08/10] more work on renderable entities --- .../entities-renderer/src/RenderableEntityItem.cpp | 13 +++++++------ .../entities-renderer/src/RenderableEntityItem.h | 7 ++++++- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableEntityItem.cpp b/libraries/entities-renderer/src/RenderableEntityItem.cpp index d37eb4cff8..5be8f72365 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableEntityItem.cpp @@ -14,14 +14,10 @@ namespace render { 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; + return ItemKey::Builder::opaqueShape(); } template <> const Item::Bound payloadGetBound(const RenderableEntityItem::Pointer& payload) { - qDebug() << "payloadGetBound()... for payload:" << payload.get(); if (payload && payload->entity) { return payload->entity->getAABox(); } @@ -35,8 +31,13 @@ namespace render { args->_elementsTouched++; if (payload && payload->entity) { qDebug() << "rendering payload!! for entity:" << payload->entity->getEntityItemID(); - payload->entity->render(args); + if (payload->entity->getType() == EntityTypes::Box) { + qDebug() << "rendering BOX type 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 2c81a31f6e..028bc5efa5 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.h +++ b/libraries/entities-renderer/src/RenderableEntityItem.h @@ -15,7 +15,6 @@ #include #include - class RenderableEntityItem { public: RenderableEntityItem(EntityItemPointer entity) : entity(entity) { } @@ -25,4 +24,10 @@ public: EntityItemPointer entity; }; +namespace render { + template <> const ItemKey payloadGetKey(const RenderableEntityItem::Pointer& payload); + template <> const Item::Bound payloadGetBound(const RenderableEntityItem::Pointer& payload); + template <> void payloadRender(const RenderableEntityItem::Pointer& payload, RenderArgs* args); +} + #endif // hifi_RenderableEntityItem_h From 37a291275d32de8f0c63c844c3410179afc648da Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 27 May 2015 16:46:44 -0700 Subject: [PATCH 09/10] more work on rendering in engine --- .../src/EntityTreeRenderer.cpp | 52 +++++++++++-------- .../src/RenderableEntityItem.cpp | 7 +-- libraries/render/src/render/DrawTask.cpp | 17 ++++++ 3 files changed, 47 insertions(+), 29 deletions(-) diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 4915eac8fe..28a913d6eb 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -480,6 +480,7 @@ void EntityTreeRenderer::applyZonePropertiesToScene(std::shared_ptr_renderSide); @@ -515,7 +516,9 @@ void EntityTreeRenderer::render(RenderArgs* renderArgs) { glPushMatrix(); renderArgs->_context->enqueueBatch(batch); glPopMatrix(); - + + renderArgs->_batch = nullptr; + // stats... _meshesConsidered = renderArgs->_meshesConsidered; _meshesRendered = renderArgs->_meshesRendered; @@ -699,35 +702,38 @@ void EntityTreeRenderer::renderElement(OctreeElement* element, RenderArgs* args) } } } + + // hack for models. :( + if (entityItem->getType() == EntityTypes::Model) { + // render entityItem + AABox entityBox = entityItem->getAABox(); - // render entityItem - AABox entityBox = entityItem->getAABox(); + // TODO: some entity types (like lights) might want to be rendered even + // when they are outside of the view frustum... + float distance = args->_viewFrustum->distanceToCamera(entityBox.calcCenter()); - // TODO: some entity types (like lights) might want to be rendered even - // when they are outside of the view frustum... - float distance = args->_viewFrustum->distanceToCamera(entityBox.calcCenter()); - - bool outOfView = args->_viewFrustum->boxInFrustum(entityBox) == ViewFrustum::OUTSIDE; - if (!outOfView) { - bool bigEnoughToRender = _viewState->shouldRenderMesh(entityBox.getLargestDimension(), distance); + bool outOfView = args->_viewFrustum->boxInFrustum(entityBox) == ViewFrustum::OUTSIDE; + if (!outOfView) { + bool bigEnoughToRender = _viewState->shouldRenderMesh(entityBox.getLargestDimension(), distance); - if (bigEnoughToRender) { - renderProxies(entityItem, args); + if (bigEnoughToRender) { + renderProxies(entityItem, args); - Glower* glower = NULL; - if (entityItem->getGlowLevel() > 0.0f) { - glower = new Glower(args, entityItem->getGlowLevel()); - } - entityItem->render(args); - args->_itemsRendered++; - if (glower) { - delete glower; + Glower* glower = NULL; + if (entityItem->getGlowLevel() > 0.0f) { + glower = new Glower(args, entityItem->getGlowLevel()); + } + entityItem->render(args); + args->_itemsRendered++; + if (glower) { + delete glower; + } + } else { + args->_itemsTooSmall++; } } else { - args->_itemsTooSmall++; + args->_itemsOutOfView++; } - } else { - args->_itemsOutOfView++; } } } diff --git a/libraries/entities-renderer/src/RenderableEntityItem.cpp b/libraries/entities-renderer/src/RenderableEntityItem.cpp index 5be8f72365..355a004594 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableEntityItem.cpp @@ -24,15 +24,10 @@ namespace render { return render::Item::Bound(); } 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 (payload && payload->entity) { - qDebug() << "rendering payload!! for entity:" << payload->entity->getEntityItemID(); - if (payload->entity->getType() == EntityTypes::Box) { - qDebug() << "rendering BOX type for entity:" << payload->entity->getEntityItemID(); + if (payload->entity->getType() != EntityTypes::Model) { payload->entity->render(args); } } diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index fa5512cb70..3f56363b15 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -11,6 +11,12 @@ #include "DrawTask.h" +#include + +#include "gpu/Batch.h" +#include "gpu/Context.h" + + using namespace render; @@ -28,6 +34,13 @@ void DrawSceneTask::run(const SceneContextPointer& sceneContext, const RenderCon auto& itemBucketMap = scene->getMasterBucket(); RenderArgs* args = renderContext->args; + + PerformanceTimer perfTimer("DrawSceneTask::run"); + + gpu::Batch theBatch; + + args->_batch = &theBatch; + // render opaques auto filter = ItemFilter::Builder::opaqueShape(); auto& opaqueShapeItems = itemBucketMap.at(filter); @@ -37,7 +50,11 @@ void DrawSceneTask::run(const SceneContextPointer& sceneContext, const RenderCon for (auto id : opaqueShapeItems) { auto item = scene->getItem(id); qDebug() << " id:" << id; + qDebug() << " item:" << item; item.render(args); } + + args->_context->enqueueBatch((*args->_batch)); + args->_batch = nullptr; }; From b0cc536f53d8410faa354d027523750dba63dc2f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 27 May 2015 16:55:02 -0700 Subject: [PATCH 10/10] debug cleanup --- libraries/entities-renderer/src/EntityTreeRenderer.cpp | 10 +++------- libraries/render/src/render/DrawTask.cpp | 7 ------- libraries/render/src/render/Scene.cpp | 4 ---- 3 files changed, 3 insertions(+), 18 deletions(-) diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 28a913d6eb..b59ea7e7af 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -95,8 +95,9 @@ void EntityTreeRenderer::clear() { } OctreeRenderer::clear(); _entityScripts.clear(); - - qDebug() << "EntityTreeRenderer::clear() need to clear the scene... _viewState->getMain3DScene():" << _viewState->getMain3DScene().get(); + + // 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... "; } @@ -1062,7 +1063,6 @@ void EntityTreeRenderer::deletingEntity(const EntityItemID& 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)) { @@ -1076,7 +1076,6 @@ 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(); @@ -1086,9 +1085,6 @@ void EntityTreeRenderer::addingEntity(const EntityItemID& 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); diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index 3f56363b15..2c30d0e2f8 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -34,9 +34,6 @@ void DrawSceneTask::run(const SceneContextPointer& sceneContext, const RenderCon auto& itemBucketMap = scene->getMasterBucket(); RenderArgs* args = renderContext->args; - - PerformanceTimer perfTimer("DrawSceneTask::run"); - gpu::Batch theBatch; args->_batch = &theBatch; @@ -45,12 +42,8 @@ void DrawSceneTask::run(const SceneContextPointer& sceneContext, const RenderCon 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; - qDebug() << " item:" << item; item.render(args); } diff --git a/libraries/render/src/render/Scene.cpp b/libraries/render/src/render/Scene.cpp index 8da3119de1..8f9c5906ca 100644 --- a/libraries/render/src/render/Scene.cpp +++ b/libraries/render/src/render/Scene.cpp @@ -115,7 +115,6 @@ void consolidateChangeQueue(Scene::PendingChangesQueue& queue, Scene::PendingCha } void Scene::processPendingChangesQueue() { - qDebug() << "Scene::processPendingChangesQueue()..."; _changeQueueMutex.lock(); PendingChanges consolidatedPendingChanges; consolidateChangeQueue(_changeQueue, consolidatedPendingChanges); @@ -139,12 +138,9 @@ 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);