diff --git a/interface/src/ui/overlays/Circle3DOverlay.cpp b/interface/src/ui/overlays/Circle3DOverlay.cpp index 034095291f..55cb7ac9d2 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.cpp +++ b/interface/src/ui/overlays/Circle3DOverlay.cpp @@ -107,7 +107,7 @@ void Circle3DOverlay::render(RenderArgs* args) { Transform transform; transform.setTranslation(getCenter()); transform.setRotation(getRotation()); - transform.setScale(glm::vec3(getDimensions(), 0.01f)); + transform.setScale(glm::vec3(getDimensions(), 0.01f) / 2.0f); auto& batch = *args->_batch; diff --git a/interface/src/ui/overlays/Text3DOverlay.cpp b/interface/src/ui/overlays/Text3DOverlay.cpp index fd8410b7e6..5acd10eb45 100644 --- a/interface/src/ui/overlays/Text3DOverlay.cpp +++ b/interface/src/ui/overlays/Text3DOverlay.cpp @@ -14,10 +14,12 @@ #include "Application.h" #include "Text3DOverlay.h" +#include + const xColor DEFAULT_BACKGROUND_COLOR = { 0, 0, 0 }; const float DEFAULT_BACKGROUND_ALPHA = 0.7f; const float DEFAULT_MARGIN = 0.1f; -const int FIXED_FONT_SCALING_RATIO = FIXED_FONT_POINT_SIZE * 40.0f; // this is a ratio determined through experimentation +const int FIXED_FONT_SCALING_RATIO = FIXED_FONT_POINT_SIZE * 80.0f; // this is a ratio determined through experimentation const float LINE_SCALE_RATIO = 1.2f; Text3DOverlay::Text3DOverlay() : @@ -52,7 +54,7 @@ Text3DOverlay::~Text3DOverlay() { xColor Text3DOverlay::getBackgroundColor() { if (_colorPulse == 0.0f) { - return _backgroundColor; + return _backgroundColor; } float pulseLevel = updatePulse(); @@ -75,19 +77,23 @@ void Text3DOverlay::render(RenderArgs* args) { return; // do nothing if we're not visible } - glPushMatrix(); { - glTranslatef(_position.x, _position.y, _position.z); + auto batch = args->_batch; + + if (batch) { glm::quat rotation; - + if (_isFacingAvatar) { // rotate about vertical to face the camera rotation = Application::getInstance()->getCamera()->getRotation(); } else { rotation = getRotation(); } - - glm::vec3 axis = glm::axis(rotation); - glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z); + + Transform transform; + transform.setTranslation(_position); + transform.setRotation(rotation); + + batch->setModelTransform(transform); const float MAX_COLOR = 255.0f; xColor backgroundColor = getBackgroundColor(); @@ -96,51 +102,38 @@ void Text3DOverlay::render(RenderArgs* args) { glm::vec2 dimensions = getDimensions(); glm::vec2 halfDimensions = dimensions * 0.5f; - + const float SLIGHTLY_BEHIND = -0.005f; glm::vec3 topLeft(-halfDimensions.x, -halfDimensions.y, SLIGHTLY_BEHIND); glm::vec3 bottomRight(halfDimensions.x, halfDimensions.y, SLIGHTLY_BEHIND); - DependencyManager::get()->renderQuad(topLeft, bottomRight, quadColor); - + DependencyManager::get()->renderQuad(*batch, topLeft, bottomRight, quadColor); + // Same font properties as textSize() float maxHeight = (float)_textRenderer->computeExtent("Xy").y * LINE_SCALE_RATIO; - - float scaleFactor = (maxHeight / FIXED_FONT_SCALING_RATIO) * _lineHeight; - glTranslatef(-(halfDimensions.x - _leftMargin), halfDimensions.y - _topMargin, 0.0f); + float scaleFactor = (maxHeight / FIXED_FONT_SCALING_RATIO) * _lineHeight; glm::vec2 clipMinimum(0.0f, 0.0f); - glm::vec2 clipDimensions((dimensions.x - (_leftMargin + _rightMargin)) / scaleFactor, + glm::vec2 clipDimensions((dimensions.x - (_leftMargin + _rightMargin)) / scaleFactor, (dimensions.y - (_topMargin + _bottomMargin)) / scaleFactor); - glScalef(scaleFactor, -scaleFactor, scaleFactor); - enableClipPlane(GL_CLIP_PLANE0, -1.0f, 0.0f, 0.0f, clipMinimum.x + clipDimensions.x); - enableClipPlane(GL_CLIP_PLANE1, 1.0f, 0.0f, 0.0f, -clipMinimum.x); - enableClipPlane(GL_CLIP_PLANE2, 0.0f, -1.0f, 0.0f, clipMinimum.y + clipDimensions.y); - enableClipPlane(GL_CLIP_PLANE3, 0.0f, 1.0f, 0.0f, -clipMinimum.y); - + transform.setTranslation(_position); + transform.postTranslate(glm::vec3(-(halfDimensions.x - _leftMargin) , halfDimensions.y - _topMargin, 0.01f)); + transform.setScale(scaleFactor); + batch->setModelTransform(transform); + glm::vec4 textColor = { _color.red / MAX_COLOR, _color.green / MAX_COLOR, _color.blue / MAX_COLOR, getAlpha() }; - _textRenderer->draw(0, 0, _text, textColor); + _textRenderer->draw(*batch, 0, 0, _text, textColor); - glDisable(GL_CLIP_PLANE0); - glDisable(GL_CLIP_PLANE1); - glDisable(GL_CLIP_PLANE2); - glDisable(GL_CLIP_PLANE3); - - } glPopMatrix(); - -} + batch->setPipeline(DrawOverlay3D::getOpaquePipeline()); + } -void Text3DOverlay::enableClipPlane(GLenum plane, float x, float y, float z, float w) { - GLdouble coefficients[] = { x, y, z, w }; - glClipPlane(plane, coefficients); - glEnable(plane); } void Text3DOverlay::setProperties(const QScriptValue& properties) { Planar3DOverlay::setProperties(properties); - + QScriptValue text = properties.property("text"); if (text.isValid()) { setText(text.toVariant().toString()); diff --git a/interface/src/ui/overlays/Text3DOverlay.h b/interface/src/ui/overlays/Text3DOverlay.h index 77a5c23cb9..a30a720414 100644 --- a/interface/src/ui/overlays/Text3DOverlay.h +++ b/interface/src/ui/overlays/Text3DOverlay.h @@ -17,7 +17,7 @@ #include #include -#include +#include #include "Planar3DOverlay.h" @@ -60,9 +60,7 @@ public: virtual Text3DOverlay* createClone() const; private: - void enableClipPlane(GLenum plane, float x, float y, float z, float w); - - TextRenderer* _textRenderer = TextRenderer::getInstance(SANS_FONT_FAMILY, FIXED_FONT_POINT_SIZE); + TextRenderer3D* _textRenderer = TextRenderer3D::getInstance(SANS_FONT_FAMILY, FIXED_FONT_POINT_SIZE); QString _text; xColor _backgroundColor; diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index ced83da5e9..e0c66eb604 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -174,11 +174,11 @@ void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE); } -const gpu::PipelinePointer& DrawOverlay3D::getOpaquePipeline() const { +gpu::PipelinePointer DrawOverlay3D::_opaquePipeline; +const gpu::PipelinePointer& DrawOverlay3D::getOpaquePipeline() { if (!_opaquePipeline) { auto vs = gpu::ShaderPointer(gpu::Shader::createVertex(std::string(overlay3D_vert))); auto ps = gpu::ShaderPointer(gpu::Shader::createPixel(std::string(overlay3D_frag))); - auto program = gpu::ShaderPointer(gpu::Shader::createProgram(vs, ps)); auto state = gpu::StatePointer(new gpu::State()); @@ -238,4 +238,3 @@ void DrawOverlay3D::run(const SceneContextPointer& sceneContext, const RenderCon args->_batch = nullptr; args->_whiteTexture.reset(); } - diff --git a/libraries/render-utils/src/RenderDeferredTask.h b/libraries/render-utils/src/RenderDeferredTask.h index 2fc30d7267..2f65c5ade6 100755 --- a/libraries/render-utils/src/RenderDeferredTask.h +++ b/libraries/render-utils/src/RenderDeferredTask.h @@ -53,10 +53,10 @@ public: }; class DrawOverlay3D { - mutable gpu::PipelinePointer _opaquePipeline; //lazy evaluation hence mutable + static gpu::PipelinePointer _opaquePipeline; //lazy evaluation hence mutable public: - const gpu::PipelinePointer& getOpaquePipeline() const; - + static const gpu::PipelinePointer& getOpaquePipeline(); + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); typedef render::Job::Model JobModel;