From 6ffb9a595516bf3b7ea84453246a3de38644544d Mon Sep 17 00:00:00 2001 From: Benjamin Kyd Date: Mon, 16 Oct 2023 11:43:46 +0100 Subject: [PATCH] preview renderer working, FINALLY --- libhart/scene/camera.hpp | 2 + src/inferno.cpp | 72 ++++++++++++++++++++++++++++--- src/preview_renderer/renderer.cpp | 21 ++++++--- src/preview_renderer/shader.cpp | 5 +++ src/preview_renderer/shader.hpp | 3 ++ src/scene/camera.cpp | 5 +++ src/scene/material.cpp | 18 ++++---- src/scene/material.hpp | 11 +++-- src/scene/mesh.hpp | 1 - src/scene/objloader.cpp | 1 - src/scene/scene.cpp | 1 + 11 files changed, 113 insertions(+), 27 deletions(-) diff --git a/libhart/scene/camera.hpp b/libhart/scene/camera.hpp index 36bf152..83e3267 100644 --- a/libhart/scene/camera.hpp +++ b/libhart/scene/camera.hpp @@ -62,4 +62,6 @@ void camera_set_euler_look(Camera* camera, float roll, void camera_set_look(Camera* camera, glm::vec3 look_direction); +glm::vec3 camera_get_position(Camera* camera); + } // namespace inferno::graphics diff --git a/src/inferno.cpp b/src/inferno.cpp index 31127e7..e16e0e3 100644 --- a/src/inferno.cpp +++ b/src/inferno.cpp @@ -35,19 +35,20 @@ InfernoApp* inferno_create() graphics::window_create("Inferno v" INFERNO_VERSION, 1280, 720); // setup the scene - scene::Material basicMaterial("basic"); + scene::Material* basicMaterial = new scene::Material("basic"); graphics::Shader* basicShader = graphics::shader_create(); graphics::shader_load(basicShader, "res/shaders/basic.glsl"); graphics::shader_link(basicShader); + basicMaterial->setGlShader(basicShader); - scene::Mesh mesh; - mesh.loadOBJ("res/cornell-box.obj"); - // mesh.loadOBJ("res/sponza.obj"); - mesh.ready(); - mesh.setMaterial(&basicMaterial); + scene::Mesh* mesh = new scene::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::scene_object_add_mesh(object, mesh); scene::scene_add_object(app->Scene, object); @@ -198,6 +199,63 @@ int inferno_run(InfernoApp* app) ImGui::End(); } + if (showRenderSettings && ImGui::Begin("Inferno HART")) { + if (ImGui::TreeNode("Camera")) { + ImGui::PushItemWidth(100); + ImGui::Text("Camera Position X,Y,Z"); + + graphics::Camera* camera = scene::scene_get_camera(app->Scene); + + bool positionUpdated = false; + ImGui::DragFloat("X", &camera->Position.x, 0.01f, -FLT_MAX, FLT_MAX, "%.2f", ImGuiSliderFlags_None); + ImGui::SameLine(); + if (ImGui::IsItemEdited()) + positionUpdated = true; + ImGui::DragFloat("Y", &camera->Position.y, 0.01f, -FLT_MAX, FLT_MAX, "%.2f", ImGuiSliderFlags_None); + ImGui::SameLine(); + if (ImGui::IsItemEdited()) + positionUpdated = true; + ImGui::DragFloat("Z", &camera->Position.z, 0.01f, -FLT_MAX, FLT_MAX, "%.2f", ImGuiSliderFlags_None); + if (ImGui::IsItemEdited()) + positionUpdated = true; + if (positionUpdated) + graphics::camera_set_position(camera, graphics::camera_get_position(camera)); + + bool viewUpdated = false; + ImGui::Text("Camera Look Yaw, Pitch, Roll"); + ImGui::DragFloat("Yaw", &camera->Yaw, 0.01f, -FLT_MAX, FLT_MAX, "%.2f", ImGuiSliderFlags_None); + ImGui::SameLine(); + if (ImGui::IsItemEdited()) + viewUpdated = true; + ImGui::DragFloat("Pitch", &camera->Pitch, 0.01f, -FLT_MAX, FLT_MAX, "%.2f", ImGuiSliderFlags_None); + ImGui::SameLine(); + if (ImGui::IsItemEdited()) + viewUpdated = true; + ImGui::DragFloat("Roll", &camera->Roll, 0.01f, -FLT_MAX, FLT_MAX, "%.2f", ImGuiSliderFlags_None); + if (ImGui::IsItemEdited()) + viewUpdated = true; + + ImGui::PopItemWidth(); + ImGui::PushItemWidth(300); + + ImGui::Text("Camera Zoom"); + ImGui::DragFloat("Zoom", &camera->FOV, -0.1f, 0.01f, 180.0f, "%.2f", ImGuiSliderFlags_None); + ImGui::SameLine(); + if (ImGui::IsItemEdited()) + viewUpdated = true; + if (viewUpdated) + graphics::camera_update(camera); + + ImGui::PopItemWidth(); + ImGui::TreePop(); + } + ImGui::End(); + } + + if (showDemoWindow) { + ImGui::ShowDemoWindow(); + } + // clang-format off GLenum err; while((err = glGetError()) != GL_NO_ERROR) { diff --git a/src/preview_renderer/renderer.cpp b/src/preview_renderer/renderer.cpp index d58827c..0036a97 100644 --- a/src/preview_renderer/renderer.cpp +++ b/src/preview_renderer/renderer.cpp @@ -8,9 +8,9 @@ #include #include #include -#include -#include #include +#include +#include #include @@ -111,10 +111,21 @@ 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()); + graphics::Shader* shader = m->getMaterial()->getGlShader(); + graphics::shader_use(shader); + + auto viewMatrix = graphics::camera_get_view(scene::scene_get_camera(scene)); + auto projMatrix = graphics::camera_get_projection(scene::scene_get_camera(scene)); + + GLint uniTrans = glGetUniformLocation(graphics::shader_get_program(shader), "model"); + glUniformMatrix4fv(uniTrans, 1, GL_FALSE, glm::value_ptr(glm::mat4(1.0f))); + + GLint uniView = glGetUniformLocation(graphics::shader_get_program(shader), "view"); + glUniformMatrix4fv(uniView, 1, GL_FALSE, glm::value_ptr(viewMatrix)); + + GLint uniProj = glGetUniformLocation(graphics::shader_get_program(shader), "proj"); + glUniformMatrix4fv(uniProj, 1, GL_FALSE, glm::value_ptr(projMatrix)); glBindVertexArray(m->getVAO()); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m->getEBO()); diff --git a/src/preview_renderer/shader.cpp b/src/preview_renderer/shader.cpp index 551b93f..e085ff2 100644 --- a/src/preview_renderer/shader.cpp +++ b/src/preview_renderer/shader.cpp @@ -150,6 +150,11 @@ void shader_link(Shader* shader) glLinkProgram(shader->Program); } +GLuint shader_get_program(Shader* shader) +{ + return shader->Program; +} + void shader_add_attribute(Shader* shader, const std::string& attribute) { shader->Attributes[attribute] = glGetAttribLocation(shader->Program, attribute.c_str()); diff --git a/src/preview_renderer/shader.hpp b/src/preview_renderer/shader.hpp index 977734d..ae8a56f 100644 --- a/src/preview_renderer/shader.hpp +++ b/src/preview_renderer/shader.hpp @@ -29,6 +29,9 @@ void shader_cleanup(Shader* shader); void shader_load(Shader* shader, std::filesystem::path path); void shader_link(Shader* shader); + +GLuint shader_get_program(Shader* shader); + // TODO: Implement shader_reload void shader_add_attribute(Shader* shader, const std::string& attribute); void shader_add_uniform(Shader* shader, const std::string& uniform); diff --git a/src/scene/camera.cpp b/src/scene/camera.cpp index 9e6b380..90c30b3 100644 --- a/src/scene/camera.cpp +++ b/src/scene/camera.cpp @@ -221,4 +221,9 @@ void camera_set_look(Camera* camera, glm::vec3 look_direction) camera_update(camera); } +glm::vec3 camera_get_position(Camera* camera) +{ + return camera->Position; +} + } diff --git a/src/scene/material.cpp b/src/scene/material.cpp index e429162..6d21036 100644 --- a/src/scene/material.cpp +++ b/src/scene/material.cpp @@ -15,13 +15,13 @@ Material::~Material() } -//void Material::setGlShader(Shader* shader) -//{ - //mGlShader = shader; -//} - -//Shader* Material::getGlShader() -//{ - //return mGlShader; -//} +void Material::setGlShader(graphics::Shader* shader) +{ + mGlShader = shader; +} + +graphics::Shader* Material::getGlShader() +{ + return mGlShader; +} } diff --git a/src/scene/material.hpp b/src/scene/material.hpp index 6c92e85..ed70756 100644 --- a/src/scene/material.hpp +++ b/src/scene/material.hpp @@ -4,9 +4,12 @@ #include +namespace inferno::graphics { + class Shader; +}; + namespace inferno::scene { -//class Shader; class HitInfo; class Material { @@ -15,14 +18,14 @@ public: ~Material(); std::string getName(); - //void setGlShader(Shader* shader); - //Shader* getGlShader(); + void setGlShader(graphics::Shader* shader); + graphics::Shader* getGlShader(); glm::vec3 sample(HitInfo* hit); private: std::string mName; - //Shader* mGlShader; + graphics::Shader* mGlShader; }; } diff --git a/src/scene/mesh.hpp b/src/scene/mesh.hpp index de53991..fc585b2 100644 --- a/src/scene/mesh.hpp +++ b/src/scene/mesh.hpp @@ -1,5 +1,4 @@ #pragma once - #include #include diff --git a/src/scene/objloader.cpp b/src/scene/objloader.cpp index 5074ca2..7f0cec5 100644 --- a/src/scene/objloader.cpp +++ b/src/scene/objloader.cpp @@ -230,7 +230,6 @@ void ObjLoader::load(std::filesystem::path file) 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 32e9c6c..d518bd1 100644 --- a/src/scene/scene.cpp +++ b/src/scene/scene.cpp @@ -26,6 +26,7 @@ void scene_add_object(Scene* scene, SceneObject* object) { yolo::debug("Using scene {}", scene); yolo::debug("Adding object to scene, no Objects: {}, adding to pool of: {}", object->Meshs.size(), scene->Objects.size()); + yolo::debug("Object Mesh 0 is {}", object->Meshs[0]); scene->Objects.push_back(object); scene->DidUpdate = true; }