From 163d784f5fcd4a11477b329bd9c815943267fe10 Mon Sep 17 00:00:00 2001 From: Ben Kyd Date: Sat, 14 Oct 2023 22:10:36 +0100 Subject: [PATCH] for some reason the face count is uninitialised --- src/inferno.cpp | 161 +++++++++++++++--------------- src/preview_renderer/renderer.cpp | 7 +- src/scene/objloader.cpp | 23 +++-- src/scene/scene.cpp | 4 +- 4 files changed, 101 insertions(+), 94 deletions(-) diff --git a/src/inferno.cpp b/src/inferno.cpp index a08349a..31127e7 100644 --- a/src/inferno.cpp +++ b/src/inferno.cpp @@ -8,10 +8,10 @@ #include "preview_renderer/renderer.hpp" #include "preview_renderer/shader.hpp" -#include "scene/scene.hpp" #include "scene/camera.hpp" #include "scene/material.hpp" #include "scene/mesh.hpp" +#include "scene/scene.hpp" #include @@ -29,6 +29,7 @@ InfernoApp* inferno_create() InfernoApp* app = new InfernoApp; app->Input = new InfernoInput; + app->Scene = scene::scene_create(); // Create window graphics::window_create("Inferno v" INFERNO_VERSION, 1280, 720); @@ -39,19 +40,19 @@ InfernoApp* inferno_create() graphics::shader_load(basicShader, "res/shaders/basic.glsl"); graphics::shader_link(basicShader); - app->Scene = scene::scene_create(); + scene::Mesh mesh; + mesh.loadOBJ("res/cornell-box.obj"); + // mesh.loadOBJ("res/sponza.obj"); + mesh.ready(); + mesh.setMaterial(&basicMaterial); + scene::SceneObject* object = scene::scene_object_create(); + scene::scene_object_add_mesh(object, &mesh); - scene::Mesh cornell; - cornell.loadOBJ("res/cornell-box.obj"); - // cornell.loadOBJ("res/sponza.obj"); - cornell.ready(); - cornell.setMaterial(&basicMaterial); - scene::scene_object_add_mesh(object, &cornell); - - yolo::info("{} {}", app->Scene, object); scene::scene_add_object(app->Scene, object); + app->PreviewRenderer = graphics::preview_create(); + return app; } @@ -141,79 +142,79 @@ int inferno_run(InfernoApp* app) if (!graphics::window_new_frame()) break; - // // set the main window to the dockspace and then on the first launch set the preset - // ImGuiID dockspace_id = ImGui::GetID("main"); - // static ImGuiDockNodeFlags dockspace_flags = ImGuiDockNodeFlags_PassthruCentralNode; - // if (ImGui::DockBuilderGetNode(dockspace_id) == NULL) { - // inferno_preset_gui(app); - // } - // ImGui::DockSpace(dockspace_id, ImVec2(0.0f, 0.0f), dockspace_flags); - // - // yolo::debug("{} {} {}", app->Scene->Camera, app->Input, app->Input->MouseDelta.x); - // if (glm::length(app->Input->MouseDelta) > 0.0f) - // graphics::camera_mouse_move(app->Scene->Camera, app->Input->MouseDelta); - // if (app->Input->MovementDelta != 0b00000000) - // graphics::camera_move(app->Scene->Camera, app->Input->MovementDelta); + // set the main window to the dockspace and then on the first launch set the preset + ImGuiID dockspace_id = ImGui::GetID("main"); + static ImGuiDockNodeFlags dockspace_flags = ImGuiDockNodeFlags_PassthruCentralNode; + if (ImGui::DockBuilderGetNode(dockspace_id) == NULL) { + inferno_preset_gui(app); + } + ImGui::DockSpace(dockspace_id, ImVec2(0.0f, 0.0f), dockspace_flags); - // // Menu Bar - // static bool showPreview = true; - // static bool showRenderSettings = true; - // static bool showDemoWindow = false; - // if (ImGui::BeginMenuBar()) { - // if (ImGui::BeginMenu("Menu")) { - // ImGui::EndMenu(); - // } - // if (ImGui::BeginMenu("View")) { - // ImGui::Checkbox("Show Preview", &showPreview); - // ImGui::SameLine(); - // inferno_gui_help_marker("Show the preview window"); - // ImGui::Checkbox("Show Settings", &showRenderSettings); - // ImGui::SameLine(); - // inferno_gui_help_marker("Show the Inferno HART settings window"); - // ImGui::Checkbox("Show Demo", &showDemoWindow); - // - // ImGui::EndMenu(); - // } - // ImGui::EndMenuBar(); - // } - // - // if (showPreview && ImGui::Begin("Preview", nullptr, ImGuiWindowFlags_NoScrollbar)) { - // if (ImGui::IsWindowHovered()) { - // inferno_move_input(app); - // } else { - // inferno_stop_move_input(app); - // } - // - // graphics::raster_set_viewport(scene::scene_get_camera(app->Scene), { ImGui::GetWindowSize().x, ImGui::GetWindowSize().y }); - // graphics::preview_draw(app->PreviewRenderer, app->Scene); - // - // ImTextureID texture = (ImTextureID)graphics::preview_get_rendered_texture(app->PreviewRenderer); - // ImGui::Image( - // texture, - // { ImGui::GetWindowSize().x, ImGui::GetWindowSize().y }, - // ImVec2(0, 1), ImVec2(1, 0)); - // - // glBindFramebuffer(GL_FRAMEBUFFER, 0); - // ImGui::End(); - // } + if (glm::length(app->Input->MouseDelta) > 0.0f) + graphics::camera_mouse_move(app->Scene->Camera, app->Input->MouseDelta); + if (app->Input->MovementDelta != 0b00000000) + graphics::camera_move(app->Scene->Camera, app->Input->MovementDelta); + + // Menu Bar + static bool showPreview = true; + static bool showRenderSettings = true; + static bool showDemoWindow = false; + if (ImGui::BeginMenuBar()) { + if (ImGui::BeginMenu("Menu")) { + ImGui::EndMenu(); + } + if (ImGui::BeginMenu("View")) { + ImGui::Checkbox("Show Preview", &showPreview); + ImGui::SameLine(); + inferno_gui_help_marker("Show the preview window"); + ImGui::Checkbox("Show Settings", &showRenderSettings); + ImGui::SameLine(); + inferno_gui_help_marker("Show the Inferno HART settings window"); + ImGui::Checkbox("Show Demo", &showDemoWindow); + + ImGui::EndMenu(); + } + ImGui::EndMenuBar(); + } + + if (showPreview && ImGui::Begin("Preview", nullptr, ImGuiWindowFlags_NoScrollbar)) { + if (ImGui::IsWindowHovered()) { + inferno_move_input(app); + } else { + inferno_stop_move_input(app); + } + + graphics::raster_set_viewport(scene::scene_get_camera(app->Scene), + { ImGui::GetWindowSize().x, ImGui::GetWindowSize().y }); + graphics::preview_draw(app->PreviewRenderer, app->Scene); + + ImTextureID texture = (ImTextureID)graphics::preview_get_rendered_texture(app->PreviewRenderer); + ImGui::Image( + texture, + { ImGui::GetWindowSize().x, ImGui::GetWindowSize().y }, + ImVec2(0, 1), ImVec2(1, 0)); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + ImGui::End(); + } // clang-format off - // GLenum err; - // while((err = glGetError()) != GL_NO_ERROR) { - // std::string error; - // switch (err) { - // case GL_INVALID_ENUM: error = "INVALID_ENUM"; break; - // case GL_INVALID_VALUE: error = "INVALID_VALUE"; break; - // case GL_INVALID_OPERATION: error = "INVALID_OPERATION"; break; - // case GL_STACK_OVERFLOW: error = "STACK_OVERFLOW"; break; - // case GL_STACK_UNDERFLOW: error = "STACK_UNDERFLOW"; break; - // case GL_OUT_OF_MEMORY: error = "OUT_OF_MEMORY"; break; - // case GL_INVALID_FRAMEBUFFER_OPERATION: error = "INVALID_FRAMEBUFFER_OPERATION"; break; - // default: error = std::to_string((uint32_t)err); break; - // } - // yolo::error("[GL]: {} {}", err, error); - // } - // + GLenum err; + while((err = glGetError()) != GL_NO_ERROR) { + std::string error; + switch (err) { + case GL_INVALID_ENUM: error = "INVALID_ENUM"; break; + case GL_INVALID_VALUE: error = "INVALID_VALUE"; break; + case GL_INVALID_OPERATION: error = "INVALID_OPERATION"; break; + case GL_STACK_OVERFLOW: error = "STACK_OVERFLOW"; break; + case GL_STACK_UNDERFLOW: error = "STACK_UNDERFLOW"; break; + case GL_OUT_OF_MEMORY: error = "OUT_OF_MEMORY"; break; + case GL_INVALID_FRAMEBUFFER_OPERATION: error = "INVALID_FRAMEBUFFER_OPERATION"; break; + default: error = std::to_string((uint32_t)err); break; + } + yolo::error("[GL]: {} {}", err, error); + } + graphics::window_render(); } diff --git a/src/preview_renderer/renderer.cpp b/src/preview_renderer/renderer.cpp index e7e5aea..d58827c 100644 --- a/src/preview_renderer/renderer.cpp +++ b/src/preview_renderer/renderer.cpp @@ -3,6 +3,8 @@ #include "scene/object.hpp" #include "shader.hpp" +#include + #include #include #include @@ -109,12 +111,15 @@ void preview_draw(PreviewRenderer* renderer, scene::Scene* scene) glEnable(GL_DEPTH_TEST); for (scene::SceneObject* o : scene::scene_get_renderables(scene)) { + yolo::info("Rendering object: {}", o); for (scene::Mesh* m : scene::scene_object_get_meshs(o)) { + yolo::info("Rendering mesh: {}", m); + yolo::debug("Mesh VAO: {}, EBO: {}, Indicies: {}", m->getVAO(), m->getEBO(), m->getIndexCount()); + glBindVertexArray(m->getVAO()); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m->getEBO()); glDrawElements(GL_TRIANGLES, m->getIndexCount() * sizeof(uint32_t), GL_UNSIGNED_INT, 0); - } } diff --git a/src/scene/objloader.cpp b/src/scene/objloader.cpp index 873659d..5074ca2 100644 --- a/src/scene/objloader.cpp +++ b/src/scene/objloader.cpp @@ -60,7 +60,7 @@ void ObjLoader::load(std::filesystem::path file) std::ifstream inf; inf.open(file.c_str(), std::ios_base::in); - if (!inf.is_open()) + if (!inf.is_open()) { yolo::error("Failed to open OBJ file ", file.string()); return; @@ -82,7 +82,7 @@ void ObjLoader::load(std::filesystem::path file) std::map uniqueverts; unsigned int vert_count = 0; - while (inf.good()) + while (inf.good()) { memset( (void*)line, 0, CHARACTER_COUNT); inf.getline(line, CHARACTER_COUNT); @@ -94,7 +94,7 @@ void ObjLoader::load(std::filesystem::path file) // verts look like: // v float float float - if (strcmp(token, "v") == 0) + if (strcmp(token, "v") == 0) { float x=0, y=0, z=0, w=1; sscanf(line+2, "%f %f %f %f", &x, &y, &z, &w); @@ -110,7 +110,7 @@ void ObjLoader::load(std::filesystem::path file) } // texcoords: // vt float float - else if (strcmp(token, "vt") == 0) + else if (strcmp(token, "vt") == 0) { float x=0, y=0, z=0; sscanf(line+3, "%f %f %f", &x, &y, &z); @@ -119,14 +119,14 @@ void ObjLoader::load(std::filesystem::path file) // keep track of smoothing groups // s [number|off] - else if (strcmp(token, "s") == 0) + else if (strcmp(token, "s") == 0) { } // faces start with: // f - else if (strcmp(token, "f") == 0) + else if (strcmp(token, "f") == 0) { std::vector vindices; @@ -164,7 +164,7 @@ void ObjLoader::load(std::filesystem::path file) // being that some exporters can export either 3 or 4 sided polygon's // convert what ever was exported into triangles - for (size_t i=1; i::iterator iter; - for (iter = uniqueverts.begin(); iter != uniqueverts.end(); ++iter) + for (iter = uniqueverts.begin(); iter != uniqueverts.end(); ++iter) { mPositions[iter->second] = verts[iter->first.vert]; - if ( norms.size() > 0 ) + if ( norms.size() > 0 ) { mNormals[iter->second] = norms[iter->first.norm]; } - if ( texcoords.size() > 0) + if ( texcoords.size() > 0) { mTexCoords[iter->second] = texcoords[iter->first.coord]; } - } + } } int ObjLoader::getIndexCount() { + yolo::debug("Face count: {}", mFaces.size()); return (int)mFaces.size() * 3; } diff --git a/src/scene/scene.cpp b/src/scene/scene.cpp index 843d0d2..32e9c6c 100644 --- a/src/scene/scene.cpp +++ b/src/scene/scene.cpp @@ -13,8 +13,8 @@ Scene* scene_create() { Scene* scene = new Scene; scene->Objects = std::vector(); - scene->Camera = new graphics::Camera; - yolo::debug("Created scene {}", scene); + scene->Camera = graphics::camera_create(); + yolo::debug("Created scene {} and camera {}", scene, scene->Camera); return scene; }