From a5c5cc9b7029398cd2fa791331f50b758319c0f8 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Wed, 27 May 2015 01:15:14 -0700 Subject: [PATCH 1/2] First Item really rendering , for the WorldBox, desigining more of the RenderContext and task interface --- interface/src/Application.cpp | 76 +++++++++++++----------- libraries/render/src/render/DrawTask.cpp | 6 +- libraries/render/src/render/DrawTask.h | 2 +- libraries/render/src/render/Engine.cpp | 9 ++- libraries/render/src/render/Engine.h | 17 +++++- libraries/render/src/render/Scene.cpp | 5 +- libraries/render/src/render/Scene.h | 2 +- 7 files changed, 69 insertions(+), 48 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 36cea02bf0..077f139279 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3174,25 +3174,35 @@ const ViewFrustum* Application::getDisplayViewFrustum() const { return &_displayViewFrustum; } -class MyFirstStuff { -public: - typedef render::Payload Payload; - typedef std::shared_ptr PayloadPointer; - typedef Payload::DataPointer Pointer; - -}; - -// For Ubuntu, the compiler want's the Payload's functions to be specialized in the "render" namespace explicitely... +// WorldBox Render Data & rendering functions namespace render { - template <> const ItemKey payloadGetKey(const MyFirstStuff::Pointer& stuff) { return ItemKey::Builder::opaqueShape(); } - template <> const Item::Bound payloadGetBound(const MyFirstStuff::Pointer& stuff) { return Item::Bound(); } - template <> void payloadRender(const MyFirstStuff::Pointer& stuff, RenderArgs* args) { - if (args) { - args->_elementsTouched ++; + class WorldBoxRenderData { + public: + typedef Payload Payload; + typedef Payload::DataPointer Pointer; + + static ItemID _item; // unique WorldBoxRenderData + }; + + ItemID WorldBoxRenderData::_item = 0; + + template <> const ItemKey payloadGetKey(const WorldBoxRenderData::Pointer& stuff) { return ItemKey::Builder::opaqueShape(); } + template <> const Item::Bound payloadGetBound(const WorldBoxRenderData::Pointer& stuff) { return Item::Bound(); } + template <> void payloadRender(const WorldBoxRenderData::Pointer& stuff, RenderArgs* args) { + if (args->_renderMode != CAMERA_MODE_MIRROR && Menu::getInstance()->isOptionChecked(MenuOption::Stats)) { + PerformanceTimer perfTimer("worldBox"); + renderWorldBox(); } + + // never the less + float originSphereRadius = 0.05f; + DependencyManager::get()->renderSphere(originSphereRadius, 15, 15, glm::vec4(1.0f, 0.0f, 0.0f, 1.0f)); + } } + + void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool selfAvatarOnly) { activeRenderingThread = QThread::currentThread(); PROFILE_RANGE(__FUNCTION__); @@ -3355,11 +3365,7 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se DependencyManager::get()->prepare(); if (!selfAvatarOnly) { - // draw a red sphere - float originSphereRadius = 0.05f; - DependencyManager::get()->renderSphere(originSphereRadius, 15, 15, glm::vec4(1.0f, 0.0f, 0.0f, 1.0f)); - - + // render JS/scriptable overlays { PerformanceTimer perfTimer("3dOverlays"); @@ -3413,22 +3419,28 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se renderArgs->_renderMode = RenderArgs::NORMAL_RENDER_MODE; } - static render::ItemID myFirstRenderItem = 0; + render::Scene::PendingChanges pendingChanges; - if (myFirstRenderItem == 0) { - auto myVeryFirstStuff = MyFirstStuff::Pointer(new MyFirstStuff()); - auto myVeryFirstPayload = new MyFirstStuff::Payload(myVeryFirstStuff); - auto myFirstPayload = MyFirstStuff::PayloadPointer(myVeryFirstPayload); - myFirstRenderItem = _main3DScene->allocateID(); + // Make sure the WorldBox is in the scene + if (render::WorldBoxRenderData::_item == 0) { + auto worldBoxRenderData = render::WorldBoxRenderData::Pointer(new render::WorldBoxRenderData()); + auto worldBoxRenderPayload = render::PayloadPointer(new render::WorldBoxRenderData::Payload(worldBoxRenderData)); - render::Scene::PendingChanges pendingChanges; - pendingChanges.resetItem(myFirstRenderItem, myFirstPayload); + render::WorldBoxRenderData::_item = _main3DScene->allocateID(); - _main3DScene->enqueuePendingChanges(pendingChanges); + pendingChanges.resetItem(render::WorldBoxRenderData::_item, worldBoxRenderPayload); } - + + + _main3DScene->enqueuePendingChanges(pendingChanges); + _main3DScene->processPendingChangesQueue(); + // FOr now every frame pass the renderCOntext + render::RenderContext renderContext; + renderContext.args = renderArgs; + _renderEngine->setRenderContext(renderContext); + // Before the deferred pass, let's try to use the render engine _renderEngine->run(); @@ -3458,12 +3470,6 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se if (!selfAvatarOnly) { _nodeBoundsDisplay.draw(); - - // Render the world box - if (theCamera.getMode() != CAMERA_MODE_MIRROR && Menu::getInstance()->isOptionChecked(MenuOption::Stats)) { - PerformanceTimer perfTimer("worldBox"); - renderWorldBox(); - } // render octree fades if they exist if (_octreeFades.size() > 0) { diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index 36eafb5672..688fa31fe1 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -17,7 +17,7 @@ using namespace render; DrawSceneTask::~DrawSceneTask() { } -void DrawSceneTask::run(const SceneContextPointer& sceneContext) { +void DrawSceneTask::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { // sanity checks assert(sceneContext); if (!sceneContext->_scene) { @@ -27,14 +27,14 @@ void DrawSceneTask::run(const SceneContextPointer& sceneContext) { auto& itemBucketMap = scene->getMasterBucket(); - RenderArgs args; + RenderArgs* args = renderContext->args; // render opaques auto filter = ItemFilter::Builder::opaqueShape(); auto& opaqueShapeItems = itemBucketMap.at(filter); for (auto id : opaqueShapeItems) { auto item = scene->getItem(id); - item.render(&args); + item.render(args); } }; diff --git a/libraries/render/src/render/DrawTask.h b/libraries/render/src/render/DrawTask.h index 14b05be777..efa67b78ab 100755 --- a/libraries/render/src/render/DrawTask.h +++ b/libraries/render/src/render/DrawTask.h @@ -23,7 +23,7 @@ public: DrawSceneTask() : Task() {} ~DrawSceneTask(); - virtual void run(const SceneContextPointer& sceneContext); + virtual void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); }; diff --git a/libraries/render/src/render/Engine.cpp b/libraries/render/src/render/Engine.cpp index d1e2a87b78..1697271121 100644 --- a/libraries/render/src/render/Engine.cpp +++ b/libraries/render/src/render/Engine.cpp @@ -15,7 +15,8 @@ using namespace render; Engine::Engine() : - _sceneContext(new SceneContext()) + _sceneContext(new SceneContext()), + _renderContext(new RenderContext()) { } @@ -23,6 +24,10 @@ void Engine::registerScene(const ScenePointer& scene) { _sceneContext->_scene = scene; } +void Engine::setRenderContext(const RenderContext& renderContext) { + (*_renderContext) = renderContext; +} + void Engine::addTask(const TaskPointer& task) { if (task) { _tasks.push_back(task); @@ -31,7 +36,7 @@ void Engine::addTask(const TaskPointer& task) { void Engine::run() { for (auto task : _tasks) { - task->run(_sceneContext); + task->run(_sceneContext, _renderContext); } } diff --git a/libraries/render/src/render/Engine.h b/libraries/render/src/render/Engine.h index 0c7adadd79..247cb69c35 100644 --- a/libraries/render/src/render/Engine.h +++ b/libraries/render/src/render/Engine.h @@ -25,18 +25,25 @@ public: }; typedef std::shared_ptr SceneContextPointer; + +class RenderContext { +public: + RenderArgs* args; + + RenderContext() {} +}; +typedef std::shared_ptr RenderContextPointer; + // THe base class for a task that runs on the SceneContext class Task { public: Task() {} ~Task() {} - virtual void run(const SceneContextPointer& sceneContext) {} + virtual void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {} protected: }; - - typedef std::shared_ptr TaskPointer; typedef std::vector Tasks; @@ -51,6 +58,9 @@ public: // Register the scene should be [art of the init phase before running the engine void registerScene(const ScenePointer& scene); + // Push a RenderContext + void setRenderContext(const RenderContext& renderContext); + void addTask(const TaskPointer& task); const Tasks& getTasks() const { return _tasks; } @@ -65,6 +75,7 @@ protected: Tasks _tasks; SceneContextPointer _sceneContext; + RenderContextPointer _renderContext; }; typedef std::shared_ptr EnginePointer; diff --git a/libraries/render/src/render/Scene.cpp b/libraries/render/src/render/Scene.cpp index a59f9b9d20..8f9c5906ca 100644 --- a/libraries/render/src/render/Scene.cpp +++ b/libraries/render/src/render/Scene.cpp @@ -89,9 +89,8 @@ void Scene::PendingChanges::merge(PendingChanges& changes) { _movedItems.insert(_movedItems.end(), changes._movedItems.begin(), changes._movedItems.end()); } -Scene::Scene() : - _IDAllocator(0) -{ +Scene::Scene() { + _items.push_back(Item()); // add the itemID #0 to nothing _masterBucketMap.allocateStandardOpaqueTranparentBuckets(); } diff --git a/libraries/render/src/render/Scene.h b/libraries/render/src/render/Scene.h index a4ef798a7b..5d4444c333 100644 --- a/libraries/render/src/render/Scene.h +++ b/libraries/render/src/render/Scene.h @@ -368,7 +368,7 @@ public: protected: // Thread safe elements that can be accessed from anywhere - std::atomic _IDAllocator; + std::atomic _IDAllocator{ 1 }; // first valid itemID will be One std::mutex _changeQueueMutex; PendingChangesQueue _changeQueue; From 58e3fe695c776b60ebbc5c13fd4893e66994deb1 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Wed, 27 May 2015 01:32:40 -0700 Subject: [PATCH 2/2] Refining once more for sir gcc on Ubuntu --- interface/src/Application.cpp | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 077f139279..4399d4754f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3175,17 +3175,18 @@ const ViewFrustum* Application::getDisplayViewFrustum() const { } // WorldBox Render Data & rendering functions + +class WorldBoxRenderData { +public: + typedef render::Payload Payload; + typedef Payload::DataPointer Pointer; + + static render::ItemID _item; // unique WorldBoxRenderData +}; + +render::ItemID WorldBoxRenderData::_item = 0; + namespace render { - class WorldBoxRenderData { - public: - typedef Payload Payload; - typedef Payload::DataPointer Pointer; - - static ItemID _item; // unique WorldBoxRenderData - }; - - ItemID WorldBoxRenderData::_item = 0; - template <> const ItemKey payloadGetKey(const WorldBoxRenderData::Pointer& stuff) { return ItemKey::Builder::opaqueShape(); } template <> const Item::Bound payloadGetBound(const WorldBoxRenderData::Pointer& stuff) { return Item::Bound(); } template <> void payloadRender(const WorldBoxRenderData::Pointer& stuff, RenderArgs* args) { @@ -3422,13 +3423,13 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se render::Scene::PendingChanges pendingChanges; // Make sure the WorldBox is in the scene - if (render::WorldBoxRenderData::_item == 0) { - auto worldBoxRenderData = render::WorldBoxRenderData::Pointer(new render::WorldBoxRenderData()); - auto worldBoxRenderPayload = render::PayloadPointer(new render::WorldBoxRenderData::Payload(worldBoxRenderData)); + if (WorldBoxRenderData::_item == 0) { + auto worldBoxRenderData = WorldBoxRenderData::Pointer(new WorldBoxRenderData()); + auto worldBoxRenderPayload = render::PayloadPointer(new WorldBoxRenderData::Payload(worldBoxRenderData)); - render::WorldBoxRenderData::_item = _main3DScene->allocateID(); + WorldBoxRenderData::_item = _main3DScene->allocateID(); - pendingChanges.resetItem(render::WorldBoxRenderData::_item, worldBoxRenderPayload); + pendingChanges.resetItem(WorldBoxRenderData::_item, worldBoxRenderPayload); }