fix text size

This commit is contained in:
HifiExperiments 2024-09-06 21:41:46 -07:00
parent 74fa1d1291
commit 356ccc8b15
6 changed files with 17 additions and 25 deletions

View file

@ -1040,7 +1040,7 @@ void Avatar::renderDisplayName(gpu::Batch& batch, const ViewFrustum& view, const
QByteArray nameUTF8 = renderedDisplayName.toLocal8Bit(); QByteArray nameUTF8 = renderedDisplayName.toLocal8Bit();
// Render text slightly in front to avoid z-fighting // Render text slightly in front to avoid z-fighting
textTransform.postTranslate(glm::vec3(0.0f, 0.0f, SLIGHTLY_IN_FRONT * displayNameRenderer->getFontSize())); textTransform.postTranslate(glm::vec3(0.0f, 0.0f, SLIGHTLY_IN_FRONT));
batch.setModelTransform(textTransform); batch.setModelTransform(textTransform);
{ {
PROFILE_RANGE_BATCH(batch, __FUNCTION__":renderText"); PROFILE_RANGE_BATCH(batch, __FUNCTION__":renderText");

View file

@ -25,10 +25,6 @@
using namespace render; using namespace render;
using namespace render::entities; using namespace render::entities;
static const int FIXED_FONT_POINT_SIZE = 40;
const int FIXED_FONT_SCALING_RATIO = FIXED_FONT_POINT_SIZE * 92.0f; // Determined through experimentation to fit font to line height.
const float LINE_SCALE_RATIO = 1.2f;
TextEntityRenderer::TextEntityRenderer(const EntityItemPointer& entity) : TextEntityRenderer::TextEntityRenderer(const EntityItemPointer& entity) :
Parent(entity), Parent(entity),
_textRenderer(TextRenderer3D::getInstance(ROBOTO_FONT_FAMILY)) { _textRenderer(TextRenderer3D::getInstance(ROBOTO_FONT_FAMILY)) {
@ -193,12 +189,8 @@ void TextEntityRenderer::doRender(RenderArgs* args) {
QSizeF TextEntityRenderer::textSize(const QString& text) const { QSizeF TextEntityRenderer::textSize(const QString& text) const {
auto extents = _textRenderer->computeExtent(text); auto extents = _textRenderer->computeExtent(text);
extents.y *= 2.0f; float scale = _lineHeight / _textRenderer->getFontHeight();
return scale * QSizeF(extents.x, extents.y);
float maxHeight = (float)_textRenderer->computeExtent("Xy").y * LINE_SCALE_RATIO;
float pointToWorldScale = (maxHeight / FIXED_FONT_SCALING_RATIO) * _lineHeight;
return QSizeF(extents.x, extents.y) * pointToWorldScale;
} }
void TextEntityRenderer::onAddToSceneTyped(const TypedEntityPointer& entity) { void TextEntityRenderer::onAddToSceneTyped(const TypedEntityPointer& entity) {
@ -375,7 +367,7 @@ void entities::TextPayload::render(RenderArgs* args) {
transform.setRotation(BillboardModeHelpers::getBillboardRotation(transform.getTranslation(), transform.getRotation(), textRenderable->_billboardMode, transform.setRotation(BillboardModeHelpers::getBillboardRotation(transform.getTranslation(), transform.getRotation(), textRenderable->_billboardMode,
usePrimaryFrustum ? BillboardModeHelpers::getPrimaryViewFrustumPosition() : args->getViewFrustum().getPosition())); usePrimaryFrustum ? BillboardModeHelpers::getPrimaryViewFrustumPosition() : args->getViewFrustum().getPosition()));
float scale = textRenderable->_lineHeight / textRenderer->getFontSize(); float scale = textRenderable->_lineHeight / textRenderer->getFontHeight();
transform.postTranslate(glm::vec3(-0.5, 0.5, 1.0f + EPSILON / dimensions.z)); transform.postTranslate(glm::vec3(-0.5, 0.5, 1.0f + EPSILON / dimensions.z));
transform.setScale(scale); transform.setScale(scale);
batch.setModelTransform(transform); batch.setModelTransform(transform);

View file

@ -33,9 +33,9 @@ glm::vec2 TextRenderer3D::computeExtent(const QString& str) const {
return glm::vec2(0.0f, 0.0f); return glm::vec2(0.0f, 0.0f);
} }
float TextRenderer3D::getFontSize() const { float TextRenderer3D::getFontHeight() const {
if (_font) { if (_font) {
return _font->getFontSize(); return _font->getFontHeight();
} }
return 0.0f; return 0.0f;
} }

View file

@ -25,7 +25,7 @@ public:
static TextRenderer3D* getInstance(const char* family); static TextRenderer3D* getInstance(const char* family);
glm::vec2 computeExtent(const QString& str) const; glm::vec2 computeExtent(const QString& str) const;
float getFontSize() const; // Pixel size float getFontHeight() const;
void draw(gpu::Batch& batch, const Font::DrawProps& props); void draw(gpu::Batch& batch, const Font::DrawProps& props);
void draw(gpu::Batch& batch, const QString& font, const Font::DrawProps& props); void draw(gpu::Batch& batch, const QString& font, const Font::DrawProps& props);

View file

@ -129,7 +129,7 @@ void Font::read(QIODevice& in) {
} }
_distanceRange = glm::vec2(arteryFont.variants[0].metrics.distanceRange); _distanceRange = glm::vec2(arteryFont.variants[0].metrics.distanceRange);
_fontSize = arteryFont.variants[0].metrics.ascender + fabs(arteryFont.variants[0].metrics.descender); _fontHeight = arteryFont.variants[0].metrics.ascender + fabs(arteryFont.variants[0].metrics.descender);
_leading = arteryFont.variants[0].metrics.lineHeight; _leading = arteryFont.variants[0].metrics.lineHeight;
_spaceWidth = 0.5f * arteryFont.variants[0].metrics.emSize; // We use half the emSize as a first guess for _spaceWidth _spaceWidth = 0.5f * arteryFont.variants[0].metrics.emSize; // We use half the emSize as a first guess for _spaceWidth
@ -303,11 +303,11 @@ QStringList Font::tokenizeForWrapping(const QString& str) const {
return tokens; return tokens;
} }
glm::vec2 Font::computeTokenExtent(const QString& token) const { float Font::computeTokenWidth(const QString& token) const {
glm::vec2 advance(0, _fontSize); float advance = 0.0f;
foreach(QChar c, token) { foreach(QChar c, token) {
Q_ASSERT(c != '\n'); Q_ASSERT(c != '\n');
advance.x += (c == ' ') ? _spaceWidth : getGlyph(c).d; advance += (c == ' ') ? _spaceWidth : getGlyph(c).d;
} }
return advance; return advance;
} }
@ -318,10 +318,10 @@ glm::vec2 Font::computeExtent(const QString& str) const {
QStringList lines = splitLines(str); QStringList lines = splitLines(str);
if (!lines.empty()) { if (!lines.empty()) {
for(const auto& line : lines) { for(const auto& line : lines) {
glm::vec2 tokenExtent = computeTokenExtent(line); float tokenWidth = computeTokenWidth(line);
extent.x = std::max(tokenExtent.x, extent.x); extent.x = std::max(tokenWidth, extent.x);
} }
extent.y = lines.count() * _fontSize; extent.y = lines.count() * _fontHeight;
} }
return extent; return extent;
} }

View file

@ -63,7 +63,7 @@ public:
}; };
glm::vec2 computeExtent(const QString& str) const; glm::vec2 computeExtent(const QString& str) const;
float getFontSize() const { return _fontSize; } float getFontHeight() const { return _fontHeight; }
struct DrawProps { struct DrawProps {
DrawProps(const QString& str, const glm::vec4& color, const glm::vec3& effectColor, const glm::vec2& origin, const glm::vec2& bounds, DrawProps(const QString& str, const glm::vec4& color, const glm::vec3& effectColor, const glm::vec2& origin, const glm::vec2& bounds,
@ -103,7 +103,7 @@ private:
static Pointer load(const QString& family, QIODevice& fontFile); static Pointer load(const QString& family, QIODevice& fontFile);
QStringList tokenizeForWrapping(const QString& str) const; QStringList tokenizeForWrapping(const QString& str) const;
QStringList splitLines(const QString& str) const; QStringList splitLines(const QString& str) const;
glm::vec2 computeTokenExtent(const QString& str) const; float computeTokenWidth(const QString& str) const;
const Glyph& getGlyph(const QChar& c) const; const Glyph& getGlyph(const QChar& c) const;
void buildVertices(DrawInfo& drawInfo, const QString& str, const glm::vec2& origin, const glm::vec2& bounds, float scale, bool enlargeForShadows, void buildVertices(DrawInfo& drawInfo, const QString& str, const glm::vec2& origin, const glm::vec2& bounds, float scale, bool enlargeForShadows,
@ -121,7 +121,7 @@ private:
// Font characteristics // Font characteristics
QString _family; QString _family;
glm::vec2 _distanceRange { 1.0f }; glm::vec2 _distanceRange { 1.0f };
float _fontSize { 0.0f }; float _fontHeight { 0.0f };
float _leading { 0.0f }; float _leading { 0.0f };
float _spaceWidth { 0.0f }; float _spaceWidth { 0.0f };