105 lines
3.2 KiB
C++
105 lines
3.2 KiB
C++
#include <blt/gfx/window.h>
|
|
#include <blt/gfx/shader.h>
|
|
#include <blt/gfx/state.h>
|
|
#include <blt/std/logging.h>
|
|
#include <imgui.h>
|
|
#include "blt/gfx/imgui/IconsFontAwesome5.h"
|
|
|
|
#include "blt/gfx/renderer/resource_manager.h"
|
|
#include "blt/gfx/renderer/batch_2d_renderer.h"
|
|
#include "blt/gfx/renderer/camera.h"
|
|
#include <blt/gfx/loader/obj_loader.h>
|
|
|
|
blt::gfx::matrix_state_manager global_matrices;
|
|
blt::gfx::resource_manager resources;
|
|
blt::gfx::batch_renderer_2d renderer_2d(resources);
|
|
blt::gfx::first_person_camera camera;
|
|
|
|
std::vector<blt::gfx::vertex_array*> vao;
|
|
|
|
float x = 0, y = 0, z = 0;
|
|
float bx = 500, by = 500;
|
|
float mx = 0, my = -9.8;
|
|
|
|
void local_render(int width, int height)
|
|
{
|
|
const float w = 120, h = 120, cf = 30, rf = 15, crf = 10;
|
|
|
|
renderer_2d.drawRectangle("ibuythat", (float) width / 2.0f, (float) height / 2.0f, (float) width, (float) height, 90.0f);
|
|
renderer_2d.drawRectangle("niko", bx, by, w, h);
|
|
|
|
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<float>(rand()) / static_cast<float>(RAND_MAX) * rf + crf) - (rf + crf) / 2.0f;
|
|
}
|
|
if (by < h / 2.0 || by > height - h / 2.0)
|
|
{
|
|
my = -my;
|
|
mx += (static_cast<float>(rand()) / static_cast<float>(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;
|
|
}
|
|
|
|
void init()
|
|
{
|
|
using namespace blt::gfx;
|
|
|
|
resources.enqueue("../resources/textures/cumdollar.jpg", "ibuythat");
|
|
resources.enqueue("../resources/textures/dfoedbi-28157978-1555-45c3-b2f4-d5e5fe25b253.png", "niko");
|
|
|
|
auto object = blt::gfx::quick_load("../resources/models/complex_cube.obj");
|
|
|
|
vbo_t vertices_vbo;
|
|
vertices_vbo.allocate(static_cast<long>(object.vertex_data().size() * sizeof(blt::gfx::constructed_vertex_t)), object.vertex_data().data());
|
|
|
|
for (auto obj : object.objects())
|
|
{
|
|
vbo_t indices_vbo;
|
|
indices_vbo.allocate(static_cast<long>(obj.indices.size() * sizeof(blt::gfx::triangle_t)), obj.indices.data());
|
|
|
|
}
|
|
|
|
global_matrices.create_internals();
|
|
resources.load_resources();
|
|
renderer_2d.create();
|
|
}
|
|
|
|
void update(std::int32_t width, std::int32_t height)
|
|
{
|
|
global_matrices.update_perspectives(width, height, 90, 0.1, 2000);
|
|
ImGui::ShowDemoWindow();
|
|
ImGui::SetNextWindowSize(ImVec2(200, 100));
|
|
ImGui::Begin("Debug Info Panel", nullptr, ImGuiWindowFlags_NoResize);
|
|
ImGui::Text("%s FPS: %f", ICON_FA_WRENCH, 1.0e9 / static_cast<double>(blt::gfx::getFrameDelta()));
|
|
ImGui::Text("Draw Count: %zu", renderer_2d.draw_count());
|
|
ImGui::Text("Position: %f %f %f", camera.position().x(), camera.position().y(), camera.position().z());
|
|
ImGui::End();
|
|
|
|
camera.update();
|
|
camera.update_view(global_matrices);
|
|
global_matrices.update();
|
|
|
|
local_render(width, height);
|
|
|
|
renderer_2d.render();
|
|
}
|
|
|
|
int main()
|
|
{
|
|
blt::gfx::init(blt::gfx::window_data{"My Sexy Window", init, update}.setSyncInterval(1));
|
|
global_matrices.cleanup();
|
|
resources.cleanup();
|
|
renderer_2d.cleanup();
|
|
blt::gfx::cleanup();
|
|
return 0;
|
|
}
|