WIP: GUI Toolkit
This commit is contained in:
113
main.cc
113
main.cc
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user