From cd14fb65f043b3774606a945032c5fd5ba4db5d7 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 19 Feb 2018 23:44:23 -0800 Subject: [PATCH] First stp to add a rendering job to debug and display the workload space --- interface/src/Application.cpp | 2 +- interface/src/workload/GameWorkload.cpp | 86 +++++++++++++++++++++- interface/src/workload/GameWorkload.h | 14 +++- libraries/workload/src/workload/Engine.cpp | 6 +- libraries/workload/src/workload/Engine.h | 9 ++- libraries/workload/src/workload/Space.h | 4 + 6 files changed, 110 insertions(+), 11 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c5dab90556..7d9233e17d 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2333,7 +2333,7 @@ void Application::initializeGL() { DependencyManager::get()->initializeShapePipelines(); }); - _gameWorkload.startup(); + _gameWorkload.startup(_main3DScene); _offscreenContext = new OffscreenGLCanvas(); _offscreenContext->setObjectName("MainThreadContext"); diff --git a/interface/src/workload/GameWorkload.cpp b/interface/src/workload/GameWorkload.cpp index 7cc9cf5c25..f9a0bfa360 100644 --- a/interface/src/workload/GameWorkload.cpp +++ b/interface/src/workload/GameWorkload.cpp @@ -9,6 +9,12 @@ // #include "GameWorkload.h" +GameWorkloadContext::GameWorkloadContext(const render::ScenePointer& scene) : WorkloadContext(), _scene(scene) { +} + +GameWorkloadContext::~GameWorkloadContext() { +} + GameWorkload::GameWorkload() { } @@ -17,8 +23,8 @@ GameWorkload::~GameWorkload() { shutdown(); } -void GameWorkload::startup() { - _engine.reset(new workload::Engine()); +void GameWorkload::startup(const render::ScenePointer& scene) { + _engine.reset(new workload::Engine(std::make_shared(scene))); _engine->addJob("SpaceToRender"); } @@ -28,5 +34,79 @@ void GameWorkload::shutdown() { } -void GameSpaceToRender::run(const workload::WorkloadContextPointer& renderContext, Outputs& outputs) { + + + +class GameWorkloadRenderItem { +public: + using Payload = render::Payload; + using Pointer = Payload::DataPointer; + + GameWorkloadRenderItem() {} + ~GameWorkloadRenderItem() {} + void render(RenderArgs* args) {} + + render::Item::Bound& editBound() { _needUpdate = true; return _bound; } + const render::Item::Bound& getBound() { return _bound; } + + void setVisible(bool visible) { _isVisible = visible; } + bool isVisible() const { return _isVisible; } + +protected: + render::Item::Bound _bound; + + bool _needUpdate{ true }; + bool _isVisible{ true }; +}; + +namespace render { + template <> const ItemKey payloadGetKey(const GameWorkloadRenderItem::Pointer& payload); + template <> const Item::Bound payloadGetBound(const GameWorkloadRenderItem::Pointer& payload); + template <> void payloadRender(const GameWorkloadRenderItem::Pointer& payload, RenderArgs* args); +} + +namespace render { + template <> const ItemKey payloadGetKey(const GameWorkloadRenderItem::Pointer& payload) { + auto builder = ItemKey::Builder().withTypeShape(); + return builder.build(); + } + template <> const Item::Bound payloadGetBound(const GameWorkloadRenderItem::Pointer& payload) { + if (payload) { + return payload->getBound(); + } + return Item::Bound(); + } + template <> void payloadRender(const GameWorkloadRenderItem::Pointer& payload, RenderArgs* args) { + if (payload) { + payload->render(args); + } + } +} + + +void GameSpaceToRender::run(const workload::WorkloadContextPointer& runContext, Outputs& outputs) { + auto gameWorkloadContext = std::dynamic_pointer_cast(runContext); + if (!gameWorkloadContext) { + return; + } + + auto scene = gameWorkloadContext->_scene; + + // Valid space, let's display its content + render::Transaction transaction; + if (!render::Item::isValidID(_spaceRenderItemID)) { + _spaceRenderItemID = scene->allocateID(); + auto renderItem = std::make_shared(); + renderItem->editBound().expandedContains(glm::vec3(0.0), 32000.0); + transaction.resetItem(_spaceRenderItemID, std::make_shared(std::make_shared())); + } + + scene->enqueueTransaction(transaction); + + auto space = gameWorkloadContext->_space; + if (!space) { + return; + } + + } \ No newline at end of file diff --git a/interface/src/workload/GameWorkload.h b/interface/src/workload/GameWorkload.h index 848e01b441..1647056d60 100644 --- a/interface/src/workload/GameWorkload.h +++ b/interface/src/workload/GameWorkload.h @@ -24,6 +24,15 @@ public: void run(const workload::WorkloadContextPointer& renderContext, Outputs& outputs); protected: + render::ItemID _spaceRenderItemID{ render::Item::INVALID_ITEM_ID }; +}; + +class GameWorkloadContext : public workload::WorkloadContext { +public: + GameWorkloadContext(const render::ScenePointer& scene); + virtual ~GameWorkloadContext(); + + render::ScenePointer _scene; }; class GameWorkload { @@ -31,11 +40,10 @@ public: GameWorkload(); ~GameWorkload(); - void startup(); + void startup(const render::ScenePointer& scene); void shutdown(); - workload::EnginePointer _engine{}; - + workload::EnginePointer _engine; }; #endif \ No newline at end of file diff --git a/libraries/workload/src/workload/Engine.cpp b/libraries/workload/src/workload/Engine.cpp index 7e69731d4e..e209fbf5d5 100644 --- a/libraries/workload/src/workload/Engine.cpp +++ b/libraries/workload/src/workload/Engine.cpp @@ -33,7 +33,7 @@ namespace workload { if (_isEnabled) { std::cout << _message.toStdString() << std::endl; } - } + } }; WorkloadContext::WorkloadContext() : task::JobContext(trace_workload()) {} @@ -50,8 +50,8 @@ namespace workload { } }; - Engine::Engine() : Task("Engine", EngineModel::create()), - _context(std::make_shared()) { + Engine::Engine(const WorkloadContextPointer& context) : Task("Engine", EngineModel::create()), + _context(context) { } } // namespace workload diff --git a/libraries/workload/src/workload/Engine.h b/libraries/workload/src/workload/Engine.h index a422c5d715..1e69f555c7 100644 --- a/libraries/workload/src/workload/Engine.h +++ b/libraries/workload/src/workload/Engine.h @@ -20,6 +20,8 @@ #include +#include "Space.h" + namespace workload { // How to make an Engine under the task::Task paradigm... @@ -29,6 +31,8 @@ namespace workload { public: WorkloadContext(); virtual ~WorkloadContext() {} + + SpacePointer _space; }; using WorkloadContextPointer = std::shared_ptr; @@ -56,12 +60,15 @@ namespace workload { // (5) Engine derives from task::Task and will run all the Job's class Engine : public Task { public: - Engine(); + Engine(const WorkloadContextPointer& context = std::make_shared()); ~Engine() = default; // (6) The Engine's Context is passed to its Jobs when they are run() void run() { assert(_context); Task::run(_context); } + // Register the Space + void registerSpace(const SpacePointer& space) { _context->_space = space; } + protected: // (6) Again, the Engine's Context is passed to its Jobs when they are run() void run(const WorkloadContextPointer& context) override { assert(_context); Task::run(_context); } diff --git a/libraries/workload/src/workload/Space.h b/libraries/workload/src/workload/Space.h index 3a8dd3c488..c4e89cda60 100644 --- a/libraries/workload/src/workload/Space.h +++ b/libraries/workload/src/workload/Space.h @@ -15,9 +15,11 @@ #ifndef hifi_workload_Space_h #define hifi_workload_Space_h +#include #include #include + namespace workload { class Space { @@ -77,6 +79,8 @@ private: std::vector _freeIndices; }; +using SpacePointer = std::shared_ptr; + } // namespace workload #endif // hifi_workload_Space_h