WIP: GUI Toolkit

This commit is contained in:
2015-03-09 01:11:13 +01:00
parent ffbc59140a
commit 9d7dd452c7
24 changed files with 1003 additions and 134 deletions

113
main.cc
View File

@@ -25,6 +25,8 @@
#include "Object.hh"
#include "font.hh"
#include "Overlay.hh"
#include "TextWidget.hh"
#include "LinearLayout.hh"
using namespace gl;
@@ -80,6 +82,8 @@ int main(int argc, char *argv[])
if (!window) {
std::printf("Could not create window: %s\n", SDL_GetError());
TTF_Quit();
IMG_Quit();
SDL_Quit();
return 1;
}
@@ -88,6 +92,8 @@ int main(int argc, char *argv[])
if (!glcontext) {
std::printf("Could not create GL context: %s\n", SDL_GetError());
SDL_DestroyWindow(window);
TTF_Quit();
IMG_Quit();
SDL_Quit();
return 1;
}
@@ -135,9 +141,7 @@ int main(int argc, char *argv[])
// sf::Clock clock;
// sf::Time last = clock.getElapsedTime();
auto last = SDL_GetTicks();
VBOManager vboManager;
Texture2D cubeTex("textures/Wood_Box_Texture.jpg");
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, static_cast<int>(GL_LINEAR_MIPMAP_LINEAR));
if (SDL_GL_ExtensionSupported("GL_EXT_texture_filter_anisotropic"))
@@ -164,7 +168,8 @@ int main(int argc, char *argv[])
// const glm::vec3 lightColor[lights] = {glm::vec3(1.0, 0.9, 0.8),
// glm::vec3(0.0, 1.0, 0.0)};
// const float lightIntensity[lights] = {75.0f, 25.0f};
glm::mat4 ovlProj = glm::ortho(0.0f, static_cast<float>(width), static_cast<float>(height), 0.0f);
Framebuffer shadowFB;
@@ -195,31 +200,46 @@ int main(int argc, char *argv[])
glm::value_ptr(shadowProj));
ovlProg.use();
glUniformMatrix4fv(ovlProg.getUniformLocation("projection_matrix"), 1, GL_FALSE,
glm::value_ptr(ovlProj));
glUniform1i(ovlProg.getUniformLocation("texBase"), 0);
Object box(vboManager, "objects/woodbox.obj", prog);
Object pyramid(vboManager, "objects/pyramid.obj", prog);
Object plane(vboManager, "objects/plane.obj", prog);
float px20_width = 2.0f*(60.0f/width);
float px20_height = 2.0f*(20.0f/height);
std::vector<ovlVertexAttribs> ovlAttribs{
{{glm::packSnorm1x16(1.0-px20_width), glm::packSnorm1x16(1.0)}, {0, 0}},
{{glm::packSnorm1x16(1.0), glm::packSnorm1x16(1.0-px20_height)}, {65535u, 65535u}},
{{glm::packSnorm1x16(1.0), glm::packSnorm1x16(1.0)}, {65535u, 0}},
{{glm::packSnorm1x16(1.0-px20_width), glm::packSnorm1x16(1.0)}, {0, 0}},
{{glm::packSnorm1x16(1.0-px20_width), glm::packSnorm1x16(1.0-px20_height)}, {0, 65535u}},
{{glm::packSnorm1x16(1.0), glm::packSnorm1x16(1.0-px20_height)}, {65535u, 65535u}}};
Object box("objects/woodbox.obj");
Object pyramid("objects/pyramid.obj");
Object plane("objects/plane.obj");
Overlay ovl{vboManager, ovlAttribs, ovlProg};
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
bool close = false;
Texture2D fpsTex{64, 64, true};
unsigned fpsTime = 0, fpsCount = 0;
TextWidget fpsText{font, "0 FPS"};
fpsText.setBackgroundColor(SDL_Color{0, 255, 0, 128});
fpsText.setPadding(8, 8, 8, 8);
auto laber = make_unique<TextWidget>(font, "Dies ist ein längerer\nText, der umgebrochen werden sollte. Bla laber schwafl, laber bullshit bingo",
200, WRAP_CONTENT);
laber->setBackgroundColor(SDL_Color{255, 0, 0, 128});
laber->setPadding(4, 0, 4, 0);
SDLSurfaceUPtr buttonImg(IMG_Load("textures/button_100x30.png"));
if (!buttonImg)
throw SDLException();
auto button = make_unique<TextWidget>(font, "Do stuff!", 100, 30);
button->setPadding(6, 6, 6, 6);
button->setBackground(buttonImg.get());
button->setForegroundColor(SDL_Color{0, 0, 0, 255});
button->setAlignment(ALIGN_CENTER, ALIGN_CENTER);
auto layout = make_unique<LinearLayout>();
layout->setBackgroundColor(SDL_Color{0, 255, 255, 128});
layout->addChild(std::move(laber));
layout->addChild(std::move(button));
layout->setChildPadding(4);
layout->setPadding(4, 4, 4, 4);
layout->setGLRenderPos(200, 200);
while (!close) {
SDL_Event event;
@@ -279,10 +299,18 @@ int main(int argc, char *argv[])
glm::mat4 model = glm::translate(glm::vec3(0.5f, 0.5f, -0.5f)) *
glm::rotate(SDL_GetTicks()*0.001f, glm::vec3(1.0f, 0.0f, 0.0f)) *
glm::translate(glm::vec3(-0.5f, -0.5f, 0.5f));
box.draw(model, &shadowProg);
plane.draw(glm::translate(glm::vec3(2.0f, -2.5f, 0.0f))*
glm::rotate(0.35f, glm::vec3(0.0f, 1.0f, 0.0f)), &shadowProg);
pyramid.draw(glm::translate(glm::vec3(-2.0f, 0.0f, 0.0f)), &shadowProg);
glUniformMatrix4fv(shadowProg.getUniformLocation("model_matrix"), 1, GL_FALSE,
glm::value_ptr(model));
box.draw();
model = glm::translate(glm::vec3(2.0f, -2.5f, 0.0f)) *
glm::rotate(0.35f, glm::vec3(0.0f, 1.0f, 0.0f));
glUniformMatrix4fv(shadowProg.getUniformLocation("model_matrix"), 1, GL_FALSE,
glm::value_ptr(model));
plane.draw();
model = glm::translate(glm::vec3(-2.0f, 0.0f, 0.0f));
glUniformMatrix4fv(shadowProg.getUniformLocation("model_matrix"), 1, GL_FALSE,
glm::value_ptr(model));
pyramid.draw();
}
}
@@ -307,24 +335,37 @@ int main(int argc, char *argv[])
glm::rotate(SDL_GetTicks()*0.001f, glm::vec3(1.0f, 0.0f, 0.0f)) *
glm::translate(glm::vec3(-0.5f, -0.5f, 0.5f));
cubeTex.bind();
prog.use();
glUniformMatrix4fv(prog.getUniformLocation("model_matrix"), 1, GL_FALSE,
glm::value_ptr(model));
// Shadow maps must be rendered before real drawing can begin
glClientWaitSync(fence, SyncObjectMask(), 0xffffffffu);
glDeleteSync(fence);
box.draw(model);
box.draw();
whiteTex.bind();
plane.draw(glm::translate(glm::vec3(2.0f, -2.5f, 0.0f))*
glm::rotate(0.35f, glm::vec3(0.0f, 1.0f, 0.0f)));
model = glm::translate(glm::vec3(2.0f, -2.5f, 0.0f)) *
glm::rotate(0.35f, glm::vec3(0.0f, 1.0f, 0.0f));
glUniformMatrix4fv(prog.getUniformLocation("model_matrix"), 1, GL_FALSE,
glm::value_ptr(model));
plane.draw();
redTex.bind();
pyramid.draw(glm::translate(glm::vec3(-2.0f, 0.0f, 0.0f)));
model = glm::translate(glm::vec3(-2.0f, 0.0f, 0.0f));
glUniformMatrix4fv(prog.getUniformLocation("model_matrix"), 1, GL_FALSE,
glm::value_ptr(model));
pyramid.draw();
auto now = SDL_GetTicks();
auto elapsed = now - last;
last = now;
if (fpsTime+elapsed > 1000) {
const std::string fpsText{std::to_string(fpsCount + 1) + " FPS"s};
fpsTex = font.render(fpsText);
fpsText.setText(std::to_string(fpsCount + 1) + " FPS");
fpsCount = 0;
fpsTime = 0;
} else {
@@ -335,9 +376,10 @@ int main(int argc, char *argv[])
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
fpsTex.bind();
ovl.draw();
ovlProg.use();
fpsText.renderToGL();
layout->renderToGL();
glDisable(GL_BLEND);
SDL_GL_SwapWindow(window);
@@ -352,6 +394,7 @@ int main(int argc, char *argv[])
SDL_DestroyWindow(window);
// Clean up
TTF_Quit();
IMG_Quit();
SDL_Quit();