Working on text rendering test

This commit is contained in:
Brad Davis 2015-02-01 19:46:49 -08:00
parent ab1624b0a8
commit a096c79747

View file

@ -66,11 +66,8 @@ void main() {
//vFragColor = vec4(fract(vTexCoord), log(vTexCoord.x), 1.0); //vFragColor = vec4(fract(vTexCoord), log(vTexCoord.x), 1.0);
})XXXX"; })XXXX";
class QTestWindow : public QWindow {
class QTestWindow : public QWindow
{
Q_OBJECT Q_OBJECT
bool shuttingDown{ false };
QOpenGLContext * m_context; QOpenGLContext * m_context;
ProgramPtr shader; ProgramPtr shader;
VertexArrayPtr vao; VertexArrayPtr vao;
@ -79,121 +76,121 @@ class QTestWindow : public QWindow
TextRenderer* _textRenderer[4]; TextRenderer* _textRenderer[4];
public: public:
QTestWindow();
virtual ~QTestWindow();
void makeCurrent();
void draw();
QTestWindow() { protected:
setSurfaceType(QSurface::OpenGLSurface); void resizeEvent(QResizeEvent * ev) override;
};
QSurfaceFormat format;
// Qt Quick may need a depth and stencil buffer. Always make sure these are available.
format.setDepthBufferSize(16);
format.setStencilBufferSize(8);
format.setVersion(4, 3);
format.setProfile(QSurfaceFormat::OpenGLContextProfile::CompatibilityProfile);
setFormat(format);
m_context = new QOpenGLContext; QTestWindow::QTestWindow() {
m_context->setFormat(format); setSurfaceType(QSurface::OpenGLSurface);
m_context->create();
show(); QSurfaceFormat format;
makeCurrent(); // Qt Quick may need a depth and stencil buffer. Always make sure these are available.
format.setDepthBufferSize(16);
format.setStencilBufferSize(8);
format.setVersion(4, 3);
format.setProfile(QSurfaceFormat::OpenGLContextProfile::CompatibilityProfile);
setFormat(format);
m_context = new QOpenGLContext;
m_context->setFormat(format);
m_context->create();
show();
makeCurrent();
#ifdef WIN32 #ifdef WIN32
glewExperimental = true; glewExperimental = true;
GLenum err = glewInit(); GLenum err = glewInit();
if (GLEW_OK != err) { if (GLEW_OK != err) {
/* Problem: glewInit failed, something is seriously wrong. */ /* Problem: glewInit failed, something is seriously wrong. */
const GLubyte * errStr = glewGetErrorString(err); const GLubyte * errStr = glewGetErrorString(err);
qDebug("Error: %s\n", errStr); qDebug("Error: %s\n", errStr);
} }
qDebug("Status: Using GLEW %s\n", glewGetString(GLEW_VERSION)); qDebug("Status: Using GLEW %s\n", glewGetString(GLEW_VERSION));
if (wglewGetExtension("WGL_EXT_swap_control")) { if (wglewGetExtension("WGL_EXT_swap_control")) {
int swapInterval = wglGetSwapIntervalEXT(); int swapInterval = wglGetSwapIntervalEXT();
qDebug("V-Sync is %s\n", (swapInterval > 0 ? "ON" : "OFF")); qDebug("V-Sync is %s\n", (swapInterval > 0 ? "ON" : "OFF"));
} }
glGetError(); glGetError();
#endif #endif
setFramePosition(QPoint(100, -900)); setFramePosition(QPoint(100, -900));
resize(QSize(800, 600)); resize(QSize(800, 600));
glEnable(GL_BLEND); glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
_textRenderer[0] = TextRenderer::getInstance(SANS_FONT_FAMILY, 12); _textRenderer[0] = TextRenderer::getInstance(SANS_FONT_FAMILY, 12, false);
_textRenderer[1] = TextRenderer::getInstance("Something", 12); _textRenderer[1] = TextRenderer::getInstance("Times New Roman", 12, TextRenderer::SHADOW_EFFECT);
_textRenderer[2] = TextRenderer::getInstance(MONO_FONT_FAMILY, 48, -1, false, TextRenderer::OUTLINE_EFFECT); _textRenderer[2] = TextRenderer::getInstance(MONO_FONT_FAMILY, 48, -1, false, TextRenderer::OUTLINE_EFFECT);
_textRenderer[3] = TextRenderer::getInstance(INCONSOLATA_FONT_FAMILY, 24); _textRenderer[3] = TextRenderer::getInstance(INCONSOLATA_FONT_FAMILY, 24);
} }
virtual ~QTestWindow() { QTestWindow::~QTestWindow() {
} }
void makeCurrent() { void QTestWindow::makeCurrent() {
m_context->makeCurrent(this); m_context->makeCurrent(this);
} }
void draw() { static const char * EXAMPLE_TEXT = "Hello 1.0\nline 2";
makeCurrent(); static const glm::uvec2 QUAD_OFFSET(10, 20);
static const glm::vec3 COLORS[4] = {
{ 1, 1, 1 },
{ 0.5, 1.0, 0.5 },
{ 1.0, 0.5, 0.5 },
{ 0.5, 0.5, 1.0 },
};
glViewport(0, 0, _size.width(), _size.height()); void QTestWindow::draw() {
glClearColor(0.2f, 0.2f, 0.2f, 1); makeCurrent();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION); glViewport(0, 0, _size.width(), _size.height());
glLoadIdentity(); glClearColor(0.2f, 0.2f, 0.2f, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, _size.width(), _size.height(), 0, 1, -1);
glMatrixMode(GL_MODELVIEW);
const glm::uvec2 size = glm::uvec2(_size.width() / 2, _size.height() / 2);
const glm::uvec2 offsets[4] = {
{ QUAD_OFFSET.x, QUAD_OFFSET.y },
{ size.x + QUAD_OFFSET.x, QUAD_OFFSET.y },
{ size.x + QUAD_OFFSET.x, size.y + QUAD_OFFSET.y },
{ QUAD_OFFSET.x, size.y + QUAD_OFFSET.y },
};
{
glColor3f(0.9, 0.9, 0.9); glColor3f(0.9, 0.9, 0.9);
glBegin(GL_LINES); glBegin(GL_LINES);
glVertex2f(-1, 0); glVertex2f(0, size.y);
glVertex2f(1, 0); glVertex2f(_size.width(), size.y);
glVertex2f(0, -1); glVertex2f(size.x, 0);
glVertex2f(0, 1); glVertex2f(size.x, _size.height());
glEnd(); glEnd();
glOrtho(0, _size.width(), _size.height(), 0, 1, -1);
glMatrixMode(GL_MODELVIEW);
// glLoadIdentity();
static const char * EXAMPLE_TEXT = "Hello 1.0\nline 2";
static const glm::uvec2 offset(10, 20);
const glm::uvec2 offsets[4] = {
{ offset.x, offset.y },
{ _size.width() / 2 + offset.x, offset.y },
{ _size.width() / 2 + offset.x, _size.height() / 2 + offset.y },
{ offset.x, _size.height() / 2 + offset.y },
};
static const glm::vec3 colors[4] = {
{ 1, 1, 1 },
{ 0.5, 1.0, 0.5 },
{ 1.0, 0.5, 0.5 },
{ 0.5, 0.5, 1.0 },
};
for (int i = 0; i < 4; ++i) {
_textRenderer[i]->draw(offsets[i].x, offsets[i].y, EXAMPLE_TEXT, glm::vec4(colors[i], 1.0f));
}
m_context->swapBuffers(this);
} }
protected: for (int i = 0; i < 4; ++i) {
_textRenderer[i]->draw(offsets[i].x, offsets[i].y, EXAMPLE_TEXT, glm::vec4(COLORS[i], 1.0f));
void resizeEvent(QResizeEvent * ev) override {
QWindow::resizeEvent(ev);
_size = ev->size();
float aspect = (float)_size.width() / (float)_size.height();
glm::vec2 ortho(1.0);
if (aspect > 1.0) {
ortho.y /= aspect;
} else {
ortho.x *= aspect;
}
float x = _size.width() / 2;
float y = _size.height() / 2;
glMatrixMode(GL_PROJECTION);
glOrtho(-100, 100, -100, 100, 1, -1);
//glOrtho(-_size.width() / 2, _size.width() / 2, -_size.height() / 2, _size.height() / 2, 1, -1);
//MatrixStack::projection().top() = glm::ortho(-ortho.x, ortho.x, -ortho.y, ortho.y);
glMatrixMode(GL_MODELVIEW);
} }
}; m_context->swapBuffers(this);
}
void QTestWindow::resizeEvent(QResizeEvent * ev) {
QWindow::resizeEvent(ev);
_size = ev->size();
}
int main(int argc, char** argv) { int main(int argc, char** argv) {
QApplication app(argc, argv); QApplication app(argc, argv);