Merge pull request #5171 from huffman/fix-edit-rotate

Fix edit.js rotation display
This commit is contained in:
Clément Brisset 2015-06-24 15:35:15 -07:00
commit 6db4184748
5 changed files with 36 additions and 46 deletions

View file

@ -107,7 +107,7 @@ void Circle3DOverlay::render(RenderArgs* args) {
Transform transform; Transform transform;
transform.setTranslation(getCenter()); transform.setTranslation(getCenter());
transform.setRotation(getRotation()); transform.setRotation(getRotation());
transform.setScale(glm::vec3(getDimensions(), 0.01f)); transform.setScale(glm::vec3(getDimensions(), 0.01f) / 2.0f);
auto& batch = *args->_batch; auto& batch = *args->_batch;

View file

@ -14,10 +14,12 @@
#include "Application.h" #include "Application.h"
#include "Text3DOverlay.h" #include "Text3DOverlay.h"
#include <RenderDeferredTask.h>
const xColor DEFAULT_BACKGROUND_COLOR = { 0, 0, 0 }; const xColor DEFAULT_BACKGROUND_COLOR = { 0, 0, 0 };
const float DEFAULT_BACKGROUND_ALPHA = 0.7f; const float DEFAULT_BACKGROUND_ALPHA = 0.7f;
const float DEFAULT_MARGIN = 0.1f; 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; const float LINE_SCALE_RATIO = 1.2f;
Text3DOverlay::Text3DOverlay() : Text3DOverlay::Text3DOverlay() :
@ -52,7 +54,7 @@ Text3DOverlay::~Text3DOverlay() {
xColor Text3DOverlay::getBackgroundColor() { xColor Text3DOverlay::getBackgroundColor() {
if (_colorPulse == 0.0f) { if (_colorPulse == 0.0f) {
return _backgroundColor; return _backgroundColor;
} }
float pulseLevel = updatePulse(); float pulseLevel = updatePulse();
@ -75,19 +77,23 @@ void Text3DOverlay::render(RenderArgs* args) {
return; // do nothing if we're not visible return; // do nothing if we're not visible
} }
glPushMatrix(); { auto batch = args->_batch;
glTranslatef(_position.x, _position.y, _position.z);
if (batch) {
glm::quat rotation; glm::quat rotation;
if (_isFacingAvatar) { if (_isFacingAvatar) {
// rotate about vertical to face the camera // rotate about vertical to face the camera
rotation = Application::getInstance()->getCamera()->getRotation(); rotation = Application::getInstance()->getCamera()->getRotation();
} else { } else {
rotation = getRotation(); rotation = getRotation();
} }
glm::vec3 axis = glm::axis(rotation); Transform transform;
glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z); transform.setTranslation(_position);
transform.setRotation(rotation);
batch->setModelTransform(transform);
const float MAX_COLOR = 255.0f; const float MAX_COLOR = 255.0f;
xColor backgroundColor = getBackgroundColor(); xColor backgroundColor = getBackgroundColor();
@ -96,51 +102,38 @@ void Text3DOverlay::render(RenderArgs* args) {
glm::vec2 dimensions = getDimensions(); glm::vec2 dimensions = getDimensions();
glm::vec2 halfDimensions = dimensions * 0.5f; glm::vec2 halfDimensions = dimensions * 0.5f;
const float SLIGHTLY_BEHIND = -0.005f; const float SLIGHTLY_BEHIND = -0.005f;
glm::vec3 topLeft(-halfDimensions.x, -halfDimensions.y, SLIGHTLY_BEHIND); glm::vec3 topLeft(-halfDimensions.x, -halfDimensions.y, SLIGHTLY_BEHIND);
glm::vec3 bottomRight(halfDimensions.x, halfDimensions.y, SLIGHTLY_BEHIND); glm::vec3 bottomRight(halfDimensions.x, halfDimensions.y, SLIGHTLY_BEHIND);
DependencyManager::get<GeometryCache>()->renderQuad(topLeft, bottomRight, quadColor); DependencyManager::get<GeometryCache>()->renderQuad(*batch, topLeft, bottomRight, quadColor);
// Same font properties as textSize() // Same font properties as textSize()
float maxHeight = (float)_textRenderer->computeExtent("Xy").y * LINE_SCALE_RATIO; 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 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); (dimensions.y - (_topMargin + _bottomMargin)) / scaleFactor);
glScalef(scaleFactor, -scaleFactor, scaleFactor); transform.setTranslation(_position);
enableClipPlane(GL_CLIP_PLANE0, -1.0f, 0.0f, 0.0f, clipMinimum.x + clipDimensions.x); transform.postTranslate(glm::vec3(-(halfDimensions.x - _leftMargin) , halfDimensions.y - _topMargin, 0.01f));
enableClipPlane(GL_CLIP_PLANE1, 1.0f, 0.0f, 0.0f, -clipMinimum.x); transform.setScale(scaleFactor);
enableClipPlane(GL_CLIP_PLANE2, 0.0f, -1.0f, 0.0f, clipMinimum.y + clipDimensions.y); batch->setModelTransform(transform);
enableClipPlane(GL_CLIP_PLANE3, 0.0f, 1.0f, 0.0f, -clipMinimum.y);
glm::vec4 textColor = { _color.red / MAX_COLOR, _color.green / MAX_COLOR, _color.blue / MAX_COLOR, getAlpha() }; 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); batch->setPipeline(DrawOverlay3D::getOpaquePipeline());
glDisable(GL_CLIP_PLANE1); }
glDisable(GL_CLIP_PLANE2);
glDisable(GL_CLIP_PLANE3);
} glPopMatrix();
}
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) { void Text3DOverlay::setProperties(const QScriptValue& properties) {
Planar3DOverlay::setProperties(properties); Planar3DOverlay::setProperties(properties);
QScriptValue text = properties.property("text"); QScriptValue text = properties.property("text");
if (text.isValid()) { if (text.isValid()) {
setText(text.toVariant().toString()); setText(text.toVariant().toString());

View file

@ -17,7 +17,7 @@
#include <QString> #include <QString>
#include <RenderArgs.h> #include <RenderArgs.h>
#include <TextRenderer.h> #include <TextRenderer3D.h>
#include "Planar3DOverlay.h" #include "Planar3DOverlay.h"
@ -60,9 +60,7 @@ public:
virtual Text3DOverlay* createClone() const; virtual Text3DOverlay* createClone() const;
private: private:
void enableClipPlane(GLenum plane, float x, float y, float z, float w); TextRenderer3D* _textRenderer = TextRenderer3D::getInstance(SANS_FONT_FAMILY, FIXED_FONT_POINT_SIZE);
TextRenderer* _textRenderer = TextRenderer::getInstance(SANS_FONT_FAMILY, FIXED_FONT_POINT_SIZE);
QString _text; QString _text;
xColor _backgroundColor; xColor _backgroundColor;

View file

@ -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); 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) { if (!_opaquePipeline) {
auto vs = gpu::ShaderPointer(gpu::Shader::createVertex(std::string(overlay3D_vert))); auto vs = gpu::ShaderPointer(gpu::Shader::createVertex(std::string(overlay3D_vert)));
auto ps = gpu::ShaderPointer(gpu::Shader::createPixel(std::string(overlay3D_frag))); auto ps = gpu::ShaderPointer(gpu::Shader::createPixel(std::string(overlay3D_frag)));
auto program = gpu::ShaderPointer(gpu::Shader::createProgram(vs, ps)); auto program = gpu::ShaderPointer(gpu::Shader::createProgram(vs, ps));
auto state = gpu::StatePointer(new gpu::State()); auto state = gpu::StatePointer(new gpu::State());
@ -238,4 +238,3 @@ void DrawOverlay3D::run(const SceneContextPointer& sceneContext, const RenderCon
args->_batch = nullptr; args->_batch = nullptr;
args->_whiteTexture.reset(); args->_whiteTexture.reset();
} }

View file

@ -53,10 +53,10 @@ public:
}; };
class DrawOverlay3D { class DrawOverlay3D {
mutable gpu::PipelinePointer _opaquePipeline; //lazy evaluation hence mutable static gpu::PipelinePointer _opaquePipeline; //lazy evaluation hence mutable
public: public:
const gpu::PipelinePointer& getOpaquePipeline() const; static const gpu::PipelinePointer& getOpaquePipeline();
void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext);
typedef render::Job::Model<DrawOverlay3D> JobModel; typedef render::Job::Model<DrawOverlay3D> JobModel;