#include #include #include #include #include #include #include #include "blt/gfx/imgui/IconsFontAwesome5.h" #include #include const float raw_vertices[18] = { // first triangle 0.5f, 0.5f, 0.0f, // top right 0.5f, -0.5f, 0.0f, // bottom right -0.5f, 0.5f, 0.0f, // top left // second triangle 0.5f, -0.5f, 0.0f, // bottom right -0.5f, -0.5f, 0.0f, // bottom left -0.5f, 0.5f, 0.0f // top left }; float vertices[20] = { // positions // texture coords 0.5f, 0.5f, 0.0f, 1.0f, 1.0f, // top right 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, // bottom right -0.5f, -0.5f, 0.0f, 0.0f, 0.0f, // bottom left -0.5f, 0.5f, 0.0f, 0.0f, 1.0f // top left }; const unsigned int indices[6] = { // note that we start from 0! 0, 1, 3, // first triangle 1, 2, 3 // second triangle }; blt::gfx::vertex_array* vao; blt::gfx::shader_t* shader; blt::gfx::texture_gl2D* texture; blt::gfx::texture_gl2D* parker_texture; blt::gfx::matrix_state_manager global_matrices; float x = 0, y = 0, z = 0; float bx = 500, by = 500; float mx = 0, my = -9.8; void handle_input() { using namespace blt::gfx; float moveAtX = 0; float moveAtZ = 0; if (isKeyPressed(GLFW_KEY_W)) moveAtX = 1; else if (isKeyPressed(GLFW_KEY_S)) moveAtX = -1; else moveAtX = 0; if (isKeyPressed(GLFW_KEY_A)) moveAtZ = 1; else if (isKeyPressed(GLFW_KEY_D)) moveAtZ = -1; else moveAtZ = 0; const float speed = 270; y -= static_cast(moveAtX * speed * getFrameDeltaSeconds()); x += static_cast(moveAtZ * speed * getFrameDeltaSeconds()); blt::mat4x4 view; view.translate(x, y, z); global_matrices.setView(view); } void draw(float x_, float y_, float width_, float height_, float rot = 0) { blt::mat4x4 model; model.translate(x_, y_, 0.0f); model.scale(width_, height_, 1); model.rotateZ(blt::toRadians(rot)); shader->setMatrix("model", model); vao->bind(); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); } void init() { using namespace blt::gfx; vbo_t vertices_vbo; vbo_t indices_vbo; vertices_vbo.create(); indices_vbo.create(GL_ELEMENT_ARRAY_BUFFER); vertices_vbo.allocate(sizeof(vertices), vertices); indices_vbo.allocate(sizeof(indices), indices); vao = new vertex_array(); vao->bindVBO(vertices_vbo, 0, 3, GL_FLOAT, 5 * sizeof(float), 0); vao->bindVBO(vertices_vbo, 1, 2, GL_FLOAT, 5 * sizeof(float), 3 * sizeof(float)); vao->bindElement(indices_vbo); shader = new shader_t(shader_test_vert, shader_test_frag); shader->bindAttribute(0, "vertex"); shader->bindAttribute(1, "uv_in"); texture = new texture_gl2D(texture_file("../resources/textures/cumdollar.jpg").texture()); parker_texture = new texture_gl2D(texture_file("../resources/textures/dfoedbi-28157978-1555-45c3-b2f4-d5e5fe25b253.png").texture()); global_matrices.create_internals(); } void update(std::int32_t width, std::int32_t height) { global_matrices.update_perspectives(width, height); ImGui::ShowDemoWindow(); ImGui::SetNextWindowSize(ImVec2(150, 65)); ImGui::Begin("Debug Info Panel", nullptr, ImGuiWindowFlags_NoResize); ImGui::Text("%s FPS: %f", ICON_FA_WRENCH, 1.0e9 / static_cast(blt::gfx::getFrameDelta())); ImGui::End(); handle_input(); global_matrices.update(); shader->bind(); const float w = 120, h = 120, cf = 30, rf = 15, crf = 10; glActiveTexture(GL_TEXTURE0); parker_texture->bind(); draw(width / 2.0, height / 2.0, width, height, 90); texture->bind(); draw(bx, by, w, h, 0); bx += mx * blt::gfx::getFrameDeltaSeconds() * cf; by += my * blt::gfx::getFrameDeltaSeconds() * cf; if (bx < w / 2.0 || bx > width - w / 2.0) { mx = -mx; my += (static_cast(rand()) / static_cast(RAND_MAX) * rf + crf) - (rf + crf) / 2.0f; } if (by < h / 2.0 || by > height - h / 2.0) { my = -my; mx += (static_cast(rand()) / static_cast(RAND_MAX) * rf + crf) - (rf + crf) / 2.0f; } if (mx > 100 || mx < -100) { mx = mx * 0.2; } if (my > 100 || my < -100) my = my * 0.2; } int main() { blt::gfx::init(blt::gfx::window_data{"My Sexy Window", init, update}.setSyncInterval(1)); delete vao; delete shader; delete texture; global_matrices.cleanup(); blt::gfx::cleanup(); return 0; }