First Item really rendering , for the WorldBox, desigining more of the RenderContext and task interface

This commit is contained in:
Sam Gateau 2015-05-27 01:15:14 -07:00
parent b90e04e451
commit a5c5cc9b70
7 changed files with 69 additions and 48 deletions

View file

@ -3174,25 +3174,35 @@ const ViewFrustum* Application::getDisplayViewFrustum() const {
return &_displayViewFrustum; return &_displayViewFrustum;
} }
class MyFirstStuff { // WorldBox Render Data & rendering functions
public:
typedef render::Payload<MyFirstStuff> Payload;
typedef std::shared_ptr<render::Item::PayloadInterface> PayloadPointer;
typedef Payload::DataPointer Pointer;
};
// For Ubuntu, the compiler want's the Payload's functions to be specialized in the "render" namespace explicitely...
namespace render { namespace render {
template <> const ItemKey payloadGetKey(const MyFirstStuff::Pointer& stuff) { return ItemKey::Builder::opaqueShape(); } class WorldBoxRenderData {
template <> const Item::Bound payloadGetBound(const MyFirstStuff::Pointer& stuff) { return Item::Bound(); } public:
template <> void payloadRender(const MyFirstStuff::Pointer& stuff, RenderArgs* args) { typedef Payload<WorldBoxRenderData> Payload;
if (args) { typedef Payload::DataPointer Pointer;
args->_elementsTouched ++;
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<GeometryCache>()->renderSphere(originSphereRadius, 15, 15, glm::vec4(1.0f, 0.0f, 0.0f, 1.0f));
} }
} }
void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool selfAvatarOnly) { void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool selfAvatarOnly) {
activeRenderingThread = QThread::currentThread(); activeRenderingThread = QThread::currentThread();
PROFILE_RANGE(__FUNCTION__); PROFILE_RANGE(__FUNCTION__);
@ -3355,11 +3365,7 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se
DependencyManager::get<DeferredLightingEffect>()->prepare(); DependencyManager::get<DeferredLightingEffect>()->prepare();
if (!selfAvatarOnly) { if (!selfAvatarOnly) {
// draw a red sphere
float originSphereRadius = 0.05f;
DependencyManager::get<GeometryCache>()->renderSphere(originSphereRadius, 15, 15, glm::vec4(1.0f, 0.0f, 0.0f, 1.0f));
// render JS/scriptable overlays // render JS/scriptable overlays
{ {
PerformanceTimer perfTimer("3dOverlays"); PerformanceTimer perfTimer("3dOverlays");
@ -3413,22 +3419,28 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se
renderArgs->_renderMode = RenderArgs::NORMAL_RENDER_MODE; renderArgs->_renderMode = RenderArgs::NORMAL_RENDER_MODE;
} }
static render::ItemID myFirstRenderItem = 0; render::Scene::PendingChanges pendingChanges;
if (myFirstRenderItem == 0) { // Make sure the WorldBox is in the scene
auto myVeryFirstStuff = MyFirstStuff::Pointer(new MyFirstStuff()); if (render::WorldBoxRenderData::_item == 0) {
auto myVeryFirstPayload = new MyFirstStuff::Payload(myVeryFirstStuff); auto worldBoxRenderData = render::WorldBoxRenderData::Pointer(new render::WorldBoxRenderData());
auto myFirstPayload = MyFirstStuff::PayloadPointer(myVeryFirstPayload); auto worldBoxRenderPayload = render::PayloadPointer(new render::WorldBoxRenderData::Payload(worldBoxRenderData));
myFirstRenderItem = _main3DScene->allocateID();
render::Scene::PendingChanges pendingChanges; render::WorldBoxRenderData::_item = _main3DScene->allocateID();
pendingChanges.resetItem(myFirstRenderItem, myFirstPayload);
_main3DScene->enqueuePendingChanges(pendingChanges); pendingChanges.resetItem(render::WorldBoxRenderData::_item, worldBoxRenderPayload);
} }
_main3DScene->enqueuePendingChanges(pendingChanges);
_main3DScene->processPendingChangesQueue(); _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 // Before the deferred pass, let's try to use the render engine
_renderEngine->run(); _renderEngine->run();
@ -3458,12 +3470,6 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se
if (!selfAvatarOnly) { if (!selfAvatarOnly) {
_nodeBoundsDisplay.draw(); _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 // render octree fades if they exist
if (_octreeFades.size() > 0) { if (_octreeFades.size() > 0) {

View file

@ -17,7 +17,7 @@ using namespace render;
DrawSceneTask::~DrawSceneTask() { DrawSceneTask::~DrawSceneTask() {
} }
void DrawSceneTask::run(const SceneContextPointer& sceneContext) { void DrawSceneTask::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {
// sanity checks // sanity checks
assert(sceneContext); assert(sceneContext);
if (!sceneContext->_scene) { if (!sceneContext->_scene) {
@ -27,14 +27,14 @@ void DrawSceneTask::run(const SceneContextPointer& sceneContext) {
auto& itemBucketMap = scene->getMasterBucket(); auto& itemBucketMap = scene->getMasterBucket();
RenderArgs args; RenderArgs* args = renderContext->args;
// render opaques // render opaques
auto filter = ItemFilter::Builder::opaqueShape(); auto filter = ItemFilter::Builder::opaqueShape();
auto& opaqueShapeItems = itemBucketMap.at(filter); auto& opaqueShapeItems = itemBucketMap.at(filter);
for (auto id : opaqueShapeItems) { for (auto id : opaqueShapeItems) {
auto item = scene->getItem(id); auto item = scene->getItem(id);
item.render(&args); item.render(args);
} }
}; };

View file

@ -23,7 +23,7 @@ public:
DrawSceneTask() : Task() {} DrawSceneTask() : Task() {}
~DrawSceneTask(); ~DrawSceneTask();
virtual void run(const SceneContextPointer& sceneContext); virtual void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext);
}; };

View file

@ -15,7 +15,8 @@ using namespace render;
Engine::Engine() : Engine::Engine() :
_sceneContext(new SceneContext()) _sceneContext(new SceneContext()),
_renderContext(new RenderContext())
{ {
} }
@ -23,6 +24,10 @@ void Engine::registerScene(const ScenePointer& scene) {
_sceneContext->_scene = scene; _sceneContext->_scene = scene;
} }
void Engine::setRenderContext(const RenderContext& renderContext) {
(*_renderContext) = renderContext;
}
void Engine::addTask(const TaskPointer& task) { void Engine::addTask(const TaskPointer& task) {
if (task) { if (task) {
_tasks.push_back(task); _tasks.push_back(task);
@ -31,7 +36,7 @@ void Engine::addTask(const TaskPointer& task) {
void Engine::run() { void Engine::run() {
for (auto task : _tasks) { for (auto task : _tasks) {
task->run(_sceneContext); task->run(_sceneContext, _renderContext);
} }
} }

View file

@ -25,18 +25,25 @@ public:
}; };
typedef std::shared_ptr<SceneContext> SceneContextPointer; typedef std::shared_ptr<SceneContext> SceneContextPointer;
class RenderContext {
public:
RenderArgs* args;
RenderContext() {}
};
typedef std::shared_ptr<RenderContext> RenderContextPointer;
// THe base class for a task that runs on the SceneContext // THe base class for a task that runs on the SceneContext
class Task { class Task {
public: public:
Task() {} Task() {}
~Task() {} ~Task() {}
virtual void run(const SceneContextPointer& sceneContext) {} virtual void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {}
protected: protected:
}; };
typedef std::shared_ptr<Task> TaskPointer; typedef std::shared_ptr<Task> TaskPointer;
typedef std::vector<TaskPointer> Tasks; typedef std::vector<TaskPointer> Tasks;
@ -51,6 +58,9 @@ public:
// Register the scene should be [art of the init phase before running the engine // Register the scene should be [art of the init phase before running the engine
void registerScene(const ScenePointer& scene); void registerScene(const ScenePointer& scene);
// Push a RenderContext
void setRenderContext(const RenderContext& renderContext);
void addTask(const TaskPointer& task); void addTask(const TaskPointer& task);
const Tasks& getTasks() const { return _tasks; } const Tasks& getTasks() const { return _tasks; }
@ -65,6 +75,7 @@ protected:
Tasks _tasks; Tasks _tasks;
SceneContextPointer _sceneContext; SceneContextPointer _sceneContext;
RenderContextPointer _renderContext;
}; };
typedef std::shared_ptr<Engine> EnginePointer; typedef std::shared_ptr<Engine> EnginePointer;

View file

@ -89,9 +89,8 @@ void Scene::PendingChanges::merge(PendingChanges& changes) {
_movedItems.insert(_movedItems.end(), changes._movedItems.begin(), changes._movedItems.end()); _movedItems.insert(_movedItems.end(), changes._movedItems.begin(), changes._movedItems.end());
} }
Scene::Scene() : Scene::Scene() {
_IDAllocator(0) _items.push_back(Item()); // add the itemID #0 to nothing
{
_masterBucketMap.allocateStandardOpaqueTranparentBuckets(); _masterBucketMap.allocateStandardOpaqueTranparentBuckets();
} }

View file

@ -368,7 +368,7 @@ public:
protected: protected:
// Thread safe elements that can be accessed from anywhere // Thread safe elements that can be accessed from anywhere
std::atomic<unsigned int> _IDAllocator; std::atomic<unsigned int> _IDAllocator{ 1 }; // first valid itemID will be One
std::mutex _changeQueueMutex; std::mutex _changeQueueMutex;
PendingChangesQueue _changeQueue; PendingChangesQueue _changeQueue;