Working on overlay rendering

This commit is contained in:
Brad Davis 2015-06-16 12:14:42 -07:00
parent ba13b7820c
commit 02d33f6086
3 changed files with 39 additions and 57 deletions

View file

@ -85,55 +85,33 @@ ApplicationOverlay::~ApplicationOverlay() {
void ApplicationOverlay::renderOverlay(RenderArgs* renderArgs) {
PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "ApplicationOverlay::displayOverlay()");
Overlays& overlays = qApp->getOverlays();
glm::vec2 size = qApp->getCanvasSize();
// TODO Handle fading and deactivation/activation of UI
// TODO First render the mirror to the mirror FBO
// Now render the overlay components together into a single texture
gpu::Batch batch;
auto geometryCache = DependencyManager::get<GeometryCache>();
geometryCache->useSimpleDrawPipeline(batch);
static const float NEAR_CLIP = -10000;
static const float FAR_CLIP = 10000;
batch._glDisable(GL_DEPTH);
batch._glDisable(GL_LIGHTING);
batch._glEnable(GL_BLEND);
renderAudioMeter(batch);
renderCameraToggle(batch);
renderStatsAndLogs(batch);
renderDomainConnectionStatusBorder(batch);
renderQmlUi(batch);
// Execute the batch into our framebuffer
buildFramebufferObject();
_overlayFramebuffer->bind();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0, 0, size.x, size.y);
mat4 legacyProjection = glm::ortho<float>(0, size.x, size.y, 0, NEAR_CLIP, FAR_CLIP);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadMatrixf(glm::value_ptr(legacyProjection));
glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
// Now render the overlay components together into a single texture
gpu::Batch batch;
auto geometryCache = DependencyManager::get<GeometryCache>();
geometryCache->useSimpleDrawPipeline(batch);
batch._glDisable(GL_DEPTH);
batch._glDisable(GL_LIGHTING);
batch._glEnable(GL_BLEND);
// give external parties a change to hook in
//emit qApp->renderingOverlay();
overlays.renderHUD(renderArgs);
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
renderOverlays(batch, renderArgs);
renderAudioMeter(batch);
renderCameraToggle(batch);
renderStatsAndLogs(batch);
renderDomainConnectionStatusBorder(batch);
renderQmlUi(batch);
renderArgs->_context->syncCache();
renderArgs->_context->render(batch);
@ -150,6 +128,30 @@ void ApplicationOverlay::renderQmlUi(gpu::Batch& batch) {
}
}
void ApplicationOverlay::renderOverlays(gpu::Batch& batch, RenderArgs* renderArgs) {
static const float NEAR_CLIP = -10000;
static const float FAR_CLIP = 10000;
glm::vec2 size = qApp->getCanvasSize();
mat4 legacyProjection = glm::ortho<float>(0, size.x, size.y, 0, NEAR_CLIP, FAR_CLIP);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadMatrixf(glm::value_ptr(legacyProjection));
glMatrixMode(GL_MODELVIEW);
glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// give external parties a change to hook in
emit qApp->renderingOverlay();
qApp->getOverlays().renderHUD(renderArgs);
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
}
void ApplicationOverlay::renderCameraToggle(gpu::Batch& batch) {
/*
if (Menu::getInstance()->isOptionChecked(MenuOption::NoFaceTracking)) {

View file

@ -35,6 +35,7 @@ private:
void renderDomainConnectionStatusBorder(gpu::Batch& batch);
void renderRearView(gpu::Batch& batch);
void renderQmlUi(gpu::Batch& batch);
void renderOverlays(gpu::Batch& batch, RenderArgs* renderArgs);
void buildFramebufferObject();
float _alpha{ 1.0f };

View file

@ -434,8 +434,6 @@ glm::vec2 Font::drawString(float x, float y, const QString & str,
fromGlm(MatrixStack::projection().top()));
if (effectType == TextRenderer::OUTLINE_EFFECT) {
_program->setUniformValue("Outline", true);
} else {
_program->setUniformValue("Outline", false);
}
// Needed?
glEnable(GL_TEXTURE_2D);
@ -541,25 +539,6 @@ glm::vec2 TextRenderer::computeExtent(const QString & str) const {
return glm::vec2(0.1f,0.1f);
}
static gpu::PipelinePointer _textDrawPipeline;
void TextRenderer::useTextPipeline(gpu::Batch& batch) {
if (!_textDrawPipeline) {
auto vs = gpu::ShaderPointer(gpu::Shader::createVertex(std::string(sdf_text_vert)));
auto fs = gpu::ShaderPointer(gpu::Shader::createPixel(std::string(sdf_text_frag)));
auto program = gpu::ShaderPointer(gpu::Shader::createProgram(vs, fs));
gpu::Shader::makeProgram((*program));
auto state = gpu::StatePointer(new gpu::State());
// enable decal blend
state->setBlendFunction(true, gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA);
_textDrawPipeline.reset(gpu::Pipeline::create(program, state));
}
batch.setPipeline(_textDrawPipeline);
batch._glBindTexture(GL_TEXTURE_2D, this->_font->_texture->textureId());
}
float TextRenderer::draw(float x, float y, const QString & str,
const glm::vec4& color, const glm::vec2 & bounds) {
glm::vec4 actualColor(color);