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

View file

@ -35,6 +35,7 @@ private:
void renderDomainConnectionStatusBorder(gpu::Batch& batch); void renderDomainConnectionStatusBorder(gpu::Batch& batch);
void renderRearView(gpu::Batch& batch); void renderRearView(gpu::Batch& batch);
void renderQmlUi(gpu::Batch& batch); void renderQmlUi(gpu::Batch& batch);
void renderOverlays(gpu::Batch& batch, RenderArgs* renderArgs);
void buildFramebufferObject(); void buildFramebufferObject();
float _alpha{ 1.0f }; 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())); fromGlm(MatrixStack::projection().top()));
if (effectType == TextRenderer::OUTLINE_EFFECT) { if (effectType == TextRenderer::OUTLINE_EFFECT) {
_program->setUniformValue("Outline", true); _program->setUniformValue("Outline", true);
} else {
_program->setUniformValue("Outline", false);
} }
// Needed? // Needed?
glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D);
@ -541,25 +539,6 @@ glm::vec2 TextRenderer::computeExtent(const QString & str) const {
return glm::vec2(0.1f,0.1f); 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, float TextRenderer::draw(float x, float y, const QString & str,
const glm::vec4& color, const glm::vec2 & bounds) { const glm::vec4& color, const glm::vec2 & bounds) {
glm::vec4 actualColor(color); glm::vec4 actualColor(color);