mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 16:18:05 +02:00
Merge pull request #3782 from ctrlaltdavid/20140
CR for Job #20140 - Add Overlays.getTextWidth
This commit is contained in:
commit
b797c7b38c
8 changed files with 60 additions and 18 deletions
|
@ -1125,12 +1125,12 @@ var toolBar = (function () {
|
||||||
browseModelsButton,
|
browseModelsButton,
|
||||||
loadURLMenuItem,
|
loadURLMenuItem,
|
||||||
loadFileMenuItem,
|
loadFileMenuItem,
|
||||||
menuItemWidth = 125,
|
menuItemWidth,
|
||||||
menuItemOffset,
|
menuItemOffset,
|
||||||
menuItemHeight,
|
menuItemHeight,
|
||||||
menuItemMargin = 5,
|
menuItemMargin = 5,
|
||||||
menuTextColor = { red: 255, green: 255, blue: 255 },
|
menuTextColor = { red: 255, green: 255, blue: 255 },
|
||||||
menuBackgoundColor = { red: 18, green: 66, blue: 66 };
|
menuBackgroundColor = { red: 18, green: 66, blue: 66 };
|
||||||
|
|
||||||
function initialize() {
|
function initialize() {
|
||||||
toolBar = new ToolBar(0, 0, ToolBar.VERTICAL);
|
toolBar = new ToolBar(0, 0, ToolBar.VERTICAL);
|
||||||
|
@ -1167,9 +1167,8 @@ var toolBar = (function () {
|
||||||
loadURLMenuItem = Overlays.addOverlay("text", {
|
loadURLMenuItem = Overlays.addOverlay("text", {
|
||||||
x: newModelButton.x - menuItemWidth,
|
x: newModelButton.x - menuItemWidth,
|
||||||
y: newModelButton.y + menuItemOffset,
|
y: newModelButton.y + menuItemOffset,
|
||||||
width: menuItemWidth,
|
|
||||||
height: menuItemHeight,
|
height: menuItemHeight,
|
||||||
backgroundColor: menuBackgoundColor,
|
backgroundColor: menuBackgroundColor,
|
||||||
topMargin: menuItemMargin,
|
topMargin: menuItemMargin,
|
||||||
text: "Model URL",
|
text: "Model URL",
|
||||||
alpha: 0.9,
|
alpha: 0.9,
|
||||||
|
@ -1179,15 +1178,19 @@ var toolBar = (function () {
|
||||||
loadFileMenuItem = Overlays.addOverlay("text", {
|
loadFileMenuItem = Overlays.addOverlay("text", {
|
||||||
x: newModelButton.x - menuItemWidth,
|
x: newModelButton.x - menuItemWidth,
|
||||||
y: newModelButton.y + menuItemOffset + menuItemHeight,
|
y: newModelButton.y + menuItemOffset + menuItemHeight,
|
||||||
width: menuItemWidth,
|
|
||||||
height: menuItemHeight,
|
height: menuItemHeight,
|
||||||
backgroundColor: menuBackgoundColor,
|
backgroundColor: menuBackgroundColor,
|
||||||
topMargin: menuItemMargin,
|
topMargin: menuItemMargin,
|
||||||
text: "Model File",
|
text: "Model File",
|
||||||
alpha: 0.9,
|
alpha: 0.9,
|
||||||
visible: false
|
visible: false
|
||||||
});
|
});
|
||||||
|
|
||||||
|
menuItemWidth = Math.max(Overlays.textWidth(loadURLMenuItem, "Model URL"),
|
||||||
|
Overlays.textWidth(loadFileMenuItem, "Model File")) + 20;
|
||||||
|
Overlays.editOverlay(loadURLMenuItem, { width: menuItemWidth });
|
||||||
|
Overlays.editOverlay(loadFileMenuItem, { width: menuItemWidth });
|
||||||
|
|
||||||
newCubeButton = toolBar.addTool({
|
newCubeButton = toolBar.addTool({
|
||||||
imageURL: toolIconUrl + "add-cube.svg",
|
imageURL: toolIconUrl + "add-cube.svg",
|
||||||
subImage: { x: 0, y: Tool.IMAGE_WIDTH, width: Tool.IMAGE_WIDTH, height: Tool.IMAGE_HEIGHT },
|
subImage: { x: 0, y: Tool.IMAGE_WIDTH, width: Tool.IMAGE_WIDTH, height: Tool.IMAGE_HEIGHT },
|
||||||
|
|
|
@ -89,12 +89,12 @@ var toolBar = (function () {
|
||||||
browseModelsButton,
|
browseModelsButton,
|
||||||
loadURLMenuItem,
|
loadURLMenuItem,
|
||||||
loadFileMenuItem,
|
loadFileMenuItem,
|
||||||
menuItemWidth = 125,
|
menuItemWidth,
|
||||||
menuItemOffset,
|
menuItemOffset,
|
||||||
menuItemHeight,
|
menuItemHeight,
|
||||||
menuItemMargin = 5,
|
menuItemMargin = 5,
|
||||||
menuTextColor = { red: 255, green: 255, blue: 255 },
|
menuTextColor = { red: 255, green: 255, blue: 255 },
|
||||||
menuBackgoundColor = { red: 18, green: 66, blue: 66 };
|
menuBackgroundColor = { red: 18, green: 66, blue: 66 };
|
||||||
|
|
||||||
function initialize() {
|
function initialize() {
|
||||||
toolBar = new ToolBar(0, 0, ToolBar.VERTICAL);
|
toolBar = new ToolBar(0, 0, ToolBar.VERTICAL);
|
||||||
|
@ -131,9 +131,8 @@ var toolBar = (function () {
|
||||||
loadURLMenuItem = Overlays.addOverlay("text", {
|
loadURLMenuItem = Overlays.addOverlay("text", {
|
||||||
x: newModelButton.x - menuItemWidth,
|
x: newModelButton.x - menuItemWidth,
|
||||||
y: newModelButton.y + menuItemOffset,
|
y: newModelButton.y + menuItemOffset,
|
||||||
width: menuItemWidth,
|
|
||||||
height: menuItemHeight,
|
height: menuItemHeight,
|
||||||
backgroundColor: menuBackgoundColor,
|
backgroundColor: menuBackgroundColor,
|
||||||
topMargin: menuItemMargin,
|
topMargin: menuItemMargin,
|
||||||
text: "Model URL",
|
text: "Model URL",
|
||||||
alpha: 0.9,
|
alpha: 0.9,
|
||||||
|
@ -143,15 +142,19 @@ var toolBar = (function () {
|
||||||
loadFileMenuItem = Overlays.addOverlay("text", {
|
loadFileMenuItem = Overlays.addOverlay("text", {
|
||||||
x: newModelButton.x - menuItemWidth,
|
x: newModelButton.x - menuItemWidth,
|
||||||
y: newModelButton.y + menuItemOffset + menuItemHeight,
|
y: newModelButton.y + menuItemOffset + menuItemHeight,
|
||||||
width: menuItemWidth,
|
|
||||||
height: menuItemHeight,
|
height: menuItemHeight,
|
||||||
backgroundColor: menuBackgoundColor,
|
backgroundColor: menuBackgroundColor,
|
||||||
topMargin: menuItemMargin,
|
topMargin: menuItemMargin,
|
||||||
text: "Model File",
|
text: "Model File",
|
||||||
alpha: 0.9,
|
alpha: 0.9,
|
||||||
visible: false
|
visible: false
|
||||||
});
|
});
|
||||||
|
|
||||||
|
menuItemWidth = Math.max(Overlays.textWidth(loadURLMenuItem, "Model URL"),
|
||||||
|
Overlays.textWidth(loadFileMenuItem, "Model File")) + 20;
|
||||||
|
Overlays.editOverlay(loadURLMenuItem, { width: menuItemWidth });
|
||||||
|
Overlays.editOverlay(loadFileMenuItem, { width: menuItemWidth });
|
||||||
|
|
||||||
newCubeButton = toolBar.addTool({
|
newCubeButton = toolBar.addTool({
|
||||||
imageURL: toolIconUrl + "add-cube.svg",
|
imageURL: toolIconUrl + "add-cube.svg",
|
||||||
subImage: { x: 0, y: Tool.IMAGE_WIDTH, width: Tool.IMAGE_WIDTH, height: Tool.IMAGE_HEIGHT },
|
subImage: { x: 0, y: Tool.IMAGE_WIDTH, width: Tool.IMAGE_WIDTH, height: Tool.IMAGE_HEIGHT },
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
#include <typeinfo>
|
||||||
#include <Application.h>
|
#include <Application.h>
|
||||||
#include <Menu.h>
|
#include <Menu.h>
|
||||||
|
|
||||||
|
@ -360,3 +361,19 @@ bool Overlays::isLoaded(unsigned int id) {
|
||||||
return overlay->isLoaded();
|
return overlay->isLoaded();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float Overlays::textWidth(unsigned int id, const QString& text) const {
|
||||||
|
Overlay* thisOverlay = _overlays2D[id];
|
||||||
|
if (thisOverlay) {
|
||||||
|
if (typeid(*thisOverlay) == typeid(TextOverlay)) {
|
||||||
|
return static_cast<TextOverlay*>(thisOverlay)->textWidth(text);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
thisOverlay = _overlays3D[id];
|
||||||
|
if (thisOverlay) {
|
||||||
|
if (typeid(*thisOverlay) == typeid(Text3DOverlay)) {
|
||||||
|
return static_cast<Text3DOverlay*>(thisOverlay)->textWidth(text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0.0f;
|
||||||
|
}
|
||||||
|
|
|
@ -65,6 +65,10 @@ public slots:
|
||||||
/// returns whether the overlay's assets are loaded or not
|
/// returns whether the overlay's assets are loaded or not
|
||||||
bool isLoaded(unsigned int id);
|
bool isLoaded(unsigned int id);
|
||||||
|
|
||||||
|
/// returns the width of the given text in the specified overlay if it is a text overlay: in pixels if it is a 2D text
|
||||||
|
/// overlay; in meters if it is a 3D text overlay
|
||||||
|
float textWidth(unsigned int id, const QString& text) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QMap<unsigned int, Overlay*> _overlays2D;
|
QMap<unsigned int, Overlay*> _overlays2D;
|
||||||
QMap<unsigned int, Overlay*> _overlays3D;
|
QMap<unsigned int, Overlay*> _overlays3D;
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
|
|
||||||
const xColor DEFAULT_BACKGROUND_COLOR = { 0, 0, 0 };
|
const xColor DEFAULT_BACKGROUND_COLOR = { 0, 0, 0 };
|
||||||
const float DEFAULT_MARGIN = 0.1f;
|
const float DEFAULT_MARGIN = 0.1f;
|
||||||
|
const int FIXED_FONT_POINT_SIZE = 40;
|
||||||
|
const float LINE_SCALE_RATIO = 1.2f;
|
||||||
|
|
||||||
Text3DOverlay::Text3DOverlay() :
|
Text3DOverlay::Text3DOverlay() :
|
||||||
_backgroundColor(DEFAULT_BACKGROUND_COLOR),
|
_backgroundColor(DEFAULT_BACKGROUND_COLOR),
|
||||||
|
@ -87,11 +89,10 @@ void Text3DOverlay::render(RenderArgs* args) {
|
||||||
glVertex3f(-halfDimensions.x, halfDimensions.y, SLIGHTLY_BEHIND);
|
glVertex3f(-halfDimensions.x, halfDimensions.y, SLIGHTLY_BEHIND);
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
const int FIXED_FONT_POINT_SIZE = 40;
|
|
||||||
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 * 40.0f; // this is a ratio determined through experimentation
|
||||||
|
|
||||||
|
// Same font properties as textWidth()
|
||||||
TextRenderer* textRenderer = TextRenderer::getInstance(SANS_FONT_FAMILY, FIXED_FONT_POINT_SIZE);
|
TextRenderer* textRenderer = TextRenderer::getInstance(SANS_FONT_FAMILY, FIXED_FONT_POINT_SIZE);
|
||||||
float LINE_SCALE_RATIO = 1.2f;
|
|
||||||
float maxHeight = (float)textRenderer->calculateHeight("Xy") * LINE_SCALE_RATIO;
|
float maxHeight = (float)textRenderer->calculateHeight("Xy") * LINE_SCALE_RATIO;
|
||||||
|
|
||||||
float scaleFactor = (maxHeight / FIXED_FONT_SCALING_RATIO) * _lineHeight;
|
float scaleFactor = (maxHeight / FIXED_FONT_SCALING_RATIO) * _lineHeight;
|
||||||
|
@ -179,4 +180,9 @@ void Text3DOverlay::setProperties(const QScriptValue& properties) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float Text3DOverlay::textWidth(const QString& text) const {
|
||||||
|
QFont font(SANS_FONT_FAMILY, FIXED_FONT_POINT_SIZE); // Same font properties as render()
|
||||||
|
QFontMetrics fontMetrics(font);
|
||||||
|
float scaleFactor = _lineHeight * LINE_SCALE_RATIO / (float)FIXED_FONT_POINT_SIZE;
|
||||||
|
return scaleFactor * (float)fontMetrics.width(qPrintable(text));
|
||||||
|
}
|
||||||
|
|
|
@ -48,6 +48,8 @@ public:
|
||||||
|
|
||||||
virtual void setProperties(const QScriptValue& properties);
|
virtual void setProperties(const QScriptValue& properties);
|
||||||
|
|
||||||
|
float textWidth(const QString& text) const; // Meters
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void enableClipPlane(GLenum plane, float x, float y, float z, float w);
|
void enableClipPlane(GLenum plane, float x, float y, float z, float w);
|
||||||
|
|
||||||
|
|
|
@ -66,9 +66,8 @@ void TextOverlay::render(RenderArgs* args) {
|
||||||
glVertex2f(_bounds.left(), _bounds.bottom());
|
glVertex2f(_bounds.left(), _bounds.bottom());
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
//TextRenderer(const char* family, int pointSize = -1, int weight = -1, bool italic = false,
|
// Same font properties as textWidth()
|
||||||
// EffectType effect = NO_EFFECT, int effectThickness = 1);
|
TextRenderer* textRenderer = TextRenderer::getInstance(SANS_FONT_FAMILY, _fontSize, DEFAULT_FONT_WEIGHT);
|
||||||
TextRenderer* textRenderer = TextRenderer::getInstance(SANS_FONT_FAMILY, _fontSize, 50);
|
|
||||||
|
|
||||||
const int leftAdjust = -1; // required to make text render relative to left edge of bounds
|
const int leftAdjust = -1; // required to make text render relative to left edge of bounds
|
||||||
const int topAdjust = -2; // required to make text render relative to top edge of bounds
|
const int topAdjust = -2; // required to make text render relative to top edge of bounds
|
||||||
|
@ -126,3 +125,8 @@ void TextOverlay::setProperties(const QScriptValue& properties) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float TextOverlay::textWidth(const QString& text) const {
|
||||||
|
QFont font(SANS_FONT_FAMILY, _fontSize, DEFAULT_FONT_WEIGHT); // Same font properties as render()
|
||||||
|
QFontMetrics fontMetrics(font);
|
||||||
|
return fontMetrics.width(qPrintable(text));
|
||||||
|
}
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
const xColor DEFAULT_BACKGROUND_COLOR = { 0, 0, 0 };
|
const xColor DEFAULT_BACKGROUND_COLOR = { 0, 0, 0 };
|
||||||
const int DEFAULT_MARGIN = 10;
|
const int DEFAULT_MARGIN = 10;
|
||||||
const int DEFAULT_FONTSIZE = 11;
|
const int DEFAULT_FONTSIZE = 11;
|
||||||
|
const int DEFAULT_FONT_WEIGHT = 50;
|
||||||
|
|
||||||
class TextOverlay : public Overlay2D {
|
class TextOverlay : public Overlay2D {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
@ -53,6 +54,8 @@ public:
|
||||||
|
|
||||||
virtual void setProperties(const QScriptValue& properties);
|
virtual void setProperties(const QScriptValue& properties);
|
||||||
|
|
||||||
|
float textWidth(const QString& text) const; // Pixels
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
QString _text;
|
QString _text;
|
||||||
|
|
Loading…
Reference in a new issue