mirror of
https://github.com/Armored-Dragon/overte.git
synced 2025-03-11 16:13:16 +01:00
225 lines
8.2 KiB
C++
225 lines
8.2 KiB
C++
//
|
|
// Application_render.cpp
|
|
// interface/src
|
|
//
|
|
// 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 "Application.h"
|
|
#include <MainWindow.h>
|
|
|
|
#include <display-plugins/CompositorHelper.h>
|
|
#include <FramebufferCache.h>
|
|
#include <plugins/PluginManager.h>
|
|
#include <SceneScriptingInterface.h>
|
|
#include "ui/Stats.h"
|
|
#include "Util.h"
|
|
|
|
|
|
//void Application::paintGL() {
|
|
// // Some plugins process message events, allowing paintGL to be called reentrantly.
|
|
//
|
|
// _renderFrameCount++;
|
|
// // SG: Moved into the RenderEventHandler
|
|
// //_lastTimeRendered.start();
|
|
//
|
|
// auto lastPaintBegin = usecTimestampNow();
|
|
// PROFILE_RANGE_EX(render, __FUNCTION__, 0xff0000ff, (uint64_t)_renderFrameCount);
|
|
// PerformanceTimer perfTimer("paintGL");
|
|
//
|
|
// if (nullptr == _displayPlugin) {
|
|
// return;
|
|
// }
|
|
//
|
|
// DisplayPluginPointer displayPlugin;
|
|
// {
|
|
// PROFILE_RANGE(render, "/getActiveDisplayPlugin");
|
|
// displayPlugin = getActiveDisplayPlugin();
|
|
// }
|
|
//
|
|
// {
|
|
// PROFILE_RANGE(render, "/pluginBeginFrameRender");
|
|
// // If a display plugin loses it's underlying support, it
|
|
// // needs to be able to signal us to not use it
|
|
// if (!displayPlugin->beginFrameRender(_renderFrameCount)) {
|
|
// QMetaObject::invokeMethod(this, "updateDisplayMode");
|
|
// return;
|
|
// }
|
|
// }
|
|
//
|
|
// RenderArgs renderArgs;
|
|
// glm::mat4 HMDSensorPose;
|
|
// glm::mat4 eyeToWorld;
|
|
// glm::mat4 sensorToWorld;
|
|
//
|
|
// bool isStereo;
|
|
// glm::mat4 stereoEyeOffsets[2];
|
|
// glm::mat4 stereoEyeProjections[2];
|
|
//
|
|
// {
|
|
// QMutexLocker viewLocker(&_renderArgsMutex);
|
|
// renderArgs = _appRenderArgs._renderArgs;
|
|
//
|
|
// // don't render if there is no context.
|
|
// if (!_appRenderArgs._renderArgs._context) {
|
|
// return;
|
|
// }
|
|
//
|
|
// HMDSensorPose = _appRenderArgs._headPose;
|
|
// eyeToWorld = _appRenderArgs._eyeToWorld;
|
|
// sensorToWorld = _appRenderArgs._sensorToWorld;
|
|
// isStereo = _appRenderArgs._isStereo;
|
|
// for_each_eye([&](Eye eye) {
|
|
// stereoEyeOffsets[eye] = _appRenderArgs._eyeOffsets[eye];
|
|
// stereoEyeProjections[eye] = _appRenderArgs._eyeProjections[eye];
|
|
// });
|
|
// }
|
|
//
|
|
// {
|
|
// PROFILE_RANGE(render, "/gpuContextReset");
|
|
// _graphicsEngine.getGPUContext()->beginFrame(_appRenderArgs._view, HMDSensorPose);
|
|
// // Reset the gpu::Context Stages
|
|
// // Back to the default framebuffer;
|
|
// gpu::doInBatch("Application_render::gpuContextReset", _graphicsEngine.getGPUContext(), [&](gpu::Batch& batch) {
|
|
// batch.resetStages();
|
|
// });
|
|
// }
|
|
//
|
|
//
|
|
// {
|
|
// PROFILE_RANGE(render, "/renderOverlay");
|
|
// PerformanceTimer perfTimer("renderOverlay");
|
|
// // NOTE: There is no batch associated with this renderArgs
|
|
// // the ApplicationOverlay class assumes it's viewport is setup to be the device size
|
|
// renderArgs._viewport = glm::ivec4(0, 0, getDeviceSize() * getRenderResolutionScale());
|
|
// _applicationOverlay.renderOverlay(&renderArgs);
|
|
// }
|
|
//
|
|
// {
|
|
// PROFILE_RANGE(render, "/updateCompositor");
|
|
// getApplicationCompositor().setFrameInfo(_renderFrameCount, eyeToWorld, sensorToWorld);
|
|
// }
|
|
//
|
|
// gpu::FramebufferPointer finalFramebuffer;
|
|
// QSize finalFramebufferSize;
|
|
// {
|
|
// PROFILE_RANGE(render, "/getOutputFramebuffer");
|
|
// // Primary rendering pass
|
|
// auto framebufferCache = DependencyManager::get<FramebufferCache>();
|
|
// finalFramebufferSize = framebufferCache->getFrameBufferSize();
|
|
// // Final framebuffer that will be handled to the display-plugin
|
|
// finalFramebuffer = framebufferCache->getFramebuffer();
|
|
// }
|
|
//
|
|
// {
|
|
// if (isStereo) {
|
|
// renderArgs._context->enableStereo(true);
|
|
// renderArgs._context->setStereoProjections(stereoEyeProjections);
|
|
// renderArgs._context->setStereoViews(stereoEyeOffsets);
|
|
// }
|
|
//
|
|
// renderArgs._hudOperator = displayPlugin->getHUDOperator();
|
|
// renderArgs._hudTexture = _applicationOverlay.getOverlayTexture();
|
|
// renderArgs._blitFramebuffer = finalFramebuffer;
|
|
// _graphicsEngine.render_runRenderFrame(&renderArgs);
|
|
// }
|
|
//
|
|
// auto frame = _graphicsEngine.getGPUContext()->endFrame();
|
|
// frame->frameIndex = _renderFrameCount;
|
|
// frame->framebuffer = finalFramebuffer;
|
|
// frame->framebufferRecycler = [](const gpu::FramebufferPointer& framebuffer) {
|
|
// auto frameBufferCache = DependencyManager::get<FramebufferCache>();
|
|
// if (frameBufferCache) {
|
|
// frameBufferCache->releaseFramebuffer(framebuffer);
|
|
// }
|
|
// };
|
|
// // deliver final scene rendering commands to the display plugin
|
|
// {
|
|
// PROFILE_RANGE(render, "/pluginOutput");
|
|
// PerformanceTimer perfTimer("pluginOutput");
|
|
// _renderLoopCounter.increment();
|
|
// displayPlugin->submitFrame(frame);
|
|
// }
|
|
//
|
|
// // Reset the framebuffer and stereo state
|
|
// renderArgs._blitFramebuffer.reset();
|
|
// renderArgs._context->enableStereo(false);
|
|
//
|
|
// {
|
|
// Stats::getInstance()->setRenderDetails(renderArgs._details);
|
|
// }
|
|
//
|
|
// uint64_t lastPaintDuration = usecTimestampNow() - lastPaintBegin;
|
|
// _frameTimingsScriptingInterface.addValue(lastPaintDuration);
|
|
//}
|
|
|
|
|
|
// WorldBox Render Data & rendering functions
|
|
//
|
|
//class WorldBoxRenderData {
|
|
//public:
|
|
// typedef render::Payload<WorldBoxRenderData> Payload;
|
|
// typedef Payload::DataPointer Pointer;
|
|
//
|
|
// int _val = 0;
|
|
// static render::ItemID _item; // unique WorldBoxRenderData
|
|
//};
|
|
//
|
|
//render::ItemID WorldBoxRenderData::_item{ render::Item::INVALID_ITEM_ID };
|
|
//
|
|
//namespace render {
|
|
// template <> const ItemKey payloadGetKey(const WorldBoxRenderData::Pointer& stuff) { return ItemKey::Builder::opaqueShape().withTagBits(ItemKey::TAG_BITS_0 | ItemKey::TAG_BITS_1); }
|
|
// template <> const Item::Bound payloadGetBound(const WorldBoxRenderData::Pointer& stuff) { return Item::Bound(); }
|
|
// template <> void payloadRender(const WorldBoxRenderData::Pointer& stuff, RenderArgs* args) {
|
|
// if (Menu::getInstance()->isOptionChecked(MenuOption::WorldAxes)) {
|
|
// PerformanceTimer perfTimer("worldBox");
|
|
//
|
|
// auto& batch = *args->_batch;
|
|
// DependencyManager::get<GeometryCache>()->bindSimpleProgram(batch);
|
|
// renderWorldBox(args, batch);
|
|
// }
|
|
// }
|
|
//}
|
|
//
|
|
//void Application::runRenderFrame(RenderArgs* renderArgs) {
|
|
// PROFILE_RANGE(render, __FUNCTION__);
|
|
// PerformanceTimer perfTimer("display");
|
|
// PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "Application::runRenderFrame()");
|
|
//
|
|
// // The pending changes collecting the changes here
|
|
// render::Transaction transaction;
|
|
//
|
|
// if (DependencyManager::get<SceneScriptingInterface>()->shouldRenderEntities()) {
|
|
// // render models...
|
|
// PerformanceTimer perfTimer("entities");
|
|
// PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings),
|
|
// "Application::runRenderFrame() ... entities...");
|
|
//
|
|
// RenderArgs::DebugFlags renderDebugFlags = RenderArgs::RENDER_DEBUG_NONE;
|
|
//
|
|
// renderArgs->_debugFlags = renderDebugFlags;
|
|
// }
|
|
//
|
|
// // Make sure the WorldBox is in the scene
|
|
// // For the record, this one RenderItem is the first one we created and added to the scene.
|
|
// // We could move that code elsewhere but you know...
|
|
// if (!render::Item::isValidID(WorldBoxRenderData::_item)) {
|
|
// auto worldBoxRenderData = std::make_shared<WorldBoxRenderData>();
|
|
// auto worldBoxRenderPayload = std::make_shared<WorldBoxRenderData::Payload>(worldBoxRenderData);
|
|
//
|
|
// WorldBoxRenderData::_item = _main3DScene->allocateID();
|
|
//
|
|
// transaction.resetItem(WorldBoxRenderData::_item, worldBoxRenderPayload);
|
|
// _main3DScene->enqueueTransaction(transaction);
|
|
// }
|
|
//
|
|
// {
|
|
// PerformanceTimer perfTimer("EngineRun");
|
|
// _renderEngine->getRenderContext()->args = renderArgs;
|
|
// _renderEngine->run();
|
|
// }
|
|
//}
|
|
|