]> gitweb.ps.run Git - subsurface_scattering/commitdiff
fix lighting, add cam
authorPatrick Schönberger <patrick.schoenberger@posteo.de>
Tue, 19 Jan 2021 19:30:43 +0000 (20:30 +0100)
committerPatrick Schönberger <patrick.schoenberger@posteo.de>
Tue, 19 Jan 2021 19:30:43 +0000 (20:30 +0100)
build.cmd
src/main.cpp

index 00eecad99a7b1807de67d262ef72abd2ab8fe4ee..2e4a5c42c5ea63589b64d19615ddf0a46882e49e 100644 (file)
--- a/build.cmd
+++ b/build.cmd
@@ -1 +1,3 @@
-cl src/main.cpp /EHsc /I C:/prg/cpp/libs/SFML-2.5.1/include /I C:/prg/cpp/libs/assimp-5.0.1/include /I C:/prg/cpp/libs/assimp-5.0.1/build/include /I C:/prg/cpp/libs/glew-2.1.0/include /I C:/prg/cpp/libs/glm /link /LIBPATH:"C:/prg/cpp/libs/SFML-2.5.1/build/lib/Release" /LIBPATH:"C:/prg/cpp/libs/assimp-5.0.1/build/code/Release" /LIBPATH:"C:/prg/cpp/libs/glew-2.1.0/lib/Release/x64" sfml-system.lib sfml-window.lib sfml-graphics.lib glew32.lib opengl32.lib assimp-vc142-mt.lib
\ No newline at end of file
+Rem cl C:/prg/cpp/libs/imgui/*.cpp C:/prg/cpp/libs/imgui-sfml/*.cpp /I C:/prg/cpp/libs/imgui /I C:/prg/cpp/libs/imgui-sfml /I C:/prg/cpp/libs/SFML-2.5.1/include /c /Fo:bin/\r
+\r
+cl src/main.cpp bin/*.obj /EHsc /I C:/prg/cpp/libs/SFML-2.5.1/include /I C:/prg/cpp/libs/assimp-5.0.1/include /I C:/prg/cpp/libs/assimp-5.0.1/build/include /I C:/prg/cpp/libs/glew-2.1.0/include /I C:/prg/cpp/libs/glm /I C:/prg/cpp/libs/imgui /I C:/prg/cpp/libs/imgui-sfml /link /LIBPATH:"C:/prg/cpp/libs/SFML-2.5.1/build/lib/Release" /LIBPATH:"C:/prg/cpp/libs/assimp-5.0.1/build/code/Release" /LIBPATH:"C:/prg/cpp/libs/glew-2.1.0/lib/Release/x64" sfml-system.lib sfml-window.lib sfml-graphics.lib glew32.lib opengl32.lib assimp-vc142-mt.lib
\ No newline at end of file
index 8bdede62d035eab9802e464c63e55c5048a1c27e..564560ddfa49aaa16d49a4ec3b3844b92a8c24e7 100644 (file)
@@ -2,12 +2,18 @@
 \r
 #include <GL/glew.h>\r
 \r
+#define GLM_ENABLE_EXPERIMENTAL\r
+\r
 #include <glm/glm.hpp>\r
+#include <glm/gtx/rotate_vector.hpp>\r
 #include <glm/gtc/matrix_transform.hpp>\r
 #include <glm/gtc/type_ptr.hpp>\r
 \r
 #include <SFML/OpenGL.hpp>\r
-#include <SFML/Window.hpp>\r
+#include <SFML/Graphics.hpp>\r
+\r
+#include <imgui.h>\r
+#include <imgui-SFML.h>\r
 \r
 #include <assimp/Importer.hpp>\r
 #include <assimp/postprocess.h>\r
@@ -17,7 +23,7 @@ const char *vertexShaderSource = R"(
 #version 330 core\r
 \r
 layout (location = 0) in vec3 pos;\r
-layout (location = 0) in vec3 normal;\r
+layout (location = 1) in vec3 normal;\r
 \r
 out vec3 FragPos;\r
 out vec3 Normal;\r
@@ -65,7 +71,7 @@ void main()
 std::vector<float> vertices;\r
 std::vector<GLuint> indices;\r
 \r
-glm::vec3 lightPos(1.2f, 0.5f, 2.0f);\r
+glm::vec3 lightPos(1.2f, 5.0f, 2.0f);\r
 \r
 void load(const std::string &filename, std::vector<float> &vertices,\r
           std::vector<GLuint> &indices) {\r
@@ -73,7 +79,7 @@ void load(const std::string &filename, std::vector<float> &vertices,
 \r
   const aiScene *scene = importer.ReadFile(\r
       filename, aiProcess_CalcTangentSpace | aiProcess_Triangulate |\r
-                    aiProcess_SortByPType | aiProcess_GenNormals);\r
+                    aiProcess_SortByPType | aiProcess_GenSmoothNormals);\r
 \r
   for (int i = 0; i < scene->mMeshes[0]->mNumVertices; i++) {\r
     aiVector3D v = scene->mMeshes[0]->mVertices[i];\r
@@ -103,11 +109,13 @@ int main() {
   settings.majorVersion = 4;\r
   settings.minorVersion = 6;\r
 \r
-  sf::Window window(sf::VideoMode(800, 600), "Subsurface Scattering",\r
+  sf::RenderWindow window(sf::VideoMode(1600, 900), "Subsurface Scattering",\r
                     sf::Style::Default, settings);\r
   window.setVerticalSyncEnabled(true);\r
+  window.setMouseCursorGrabbed(true);\r
+  window.setMouseCursorVisible(false);\r
 \r
-  window.setActive(true);\r
+  ImGui::SFML::Init(window);\r
 \r
   // Initialize GLEW\r
 \r
@@ -181,9 +189,10 @@ int main() {
   glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * indices.size(),\r
                indices.data(), GL_STATIC_DRAW);\r
 \r
-  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)0);\r
-  glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)3);\r
+  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)(0));\r
   glEnableVertexAttribArray(0);\r
+  glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)(sizeof(float) * 3));\r
+  glEnableVertexAttribArray(1);\r
 \r
   glBindVertexArray(0);\r
 \r
@@ -191,47 +200,136 @@ int main() {
 \r
   glm::mat4 model = glm::scale(glm::mat4(1.0f), glm::vec3(0.01f, 0.01f, 0.01f));\r
 \r
+  struct {\r
+    float camX = 0;\r
+    float camZ = -5;\r
+    int mouseX = 0;\r
+    int mouseY = 0;\r
+  } arcball;\r
+\r
+  struct {\r
+    int mouseX = 0;\r
+    int mouseY = 0;\r
+  } freecam;\r
+\r
+  glm::vec3 camPos = glm::vec3(0, 0, -3);\r
+  glm::vec3 camForward = glm::vec3(0, 0, 1);\r
+  glm::vec3 camUp = glm::vec3(0, 1, 0);\r
+\r
   glm::mat4 view =\r
-      glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -3.0f));\r
+      glm::lookAt(glm::vec3(arcball.camX, 0.0, arcball.camZ), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0));\r
 \r
   glm::mat4 proj =\r
-      glm::perspective(glm::radians(45.0f), 800.0f / 600.0f, 0.1f, 1000.0f);\r
+      glm::perspective(glm::radians(45.0f), (float)window.getSize().x / window.getSize().y, 0.001f, 1000.0f);\r
+\r
+  struct {\r
+    bool catchMouse = false;\r
+    bool wireframe = false;\r
+    bool freecam = false;\r
+    float radius = 1.0f;\r
+  } options;\r
 \r
-  bool wireframe = false;\r
+  sf::Clock deltaClock;\r
 \r
   bool running = true;\r
   while (running) {\r
     sf::Event event;\r
     while (window.pollEvent(event)) {\r
-      if (event.type == sf::Event::Closed) {\r
+      ImGui::SFML::ProcessEvent(event);\r
+\r
+      if (event.type == sf::Event::EventType::Closed) {\r
         running = false;\r
-      } else if (event.type == sf::Event::Resized) {\r
+      } else if (event.type == sf::Event::EventType::Resized) {\r
         glViewport(0, 0, event.size.width, event.size.height);\r
-      } else if (event.type == sf::Event::KeyReleased) {\r
+      } else if (event.type == sf::Event::EventType::KeyReleased) {\r
         using keys = sf::Keyboard;\r
         switch (event.key.code) {\r
-        case keys::W:\r
-          wireframe = !wireframe;\r
-          break;\r
         case keys::Escape:\r
           running = false;\r
           break;\r
+        case keys::C:\r
+          options.catchMouse = !options.catchMouse;\r
+          break;\r
+        case keys::R:\r
+          freecam.mouseX = freecam.mouseY = 0;\r
+          break;\r
+        }\r
+      } else if (event.type == sf::Event::EventType::MouseWheelScrolled) {\r
+        options.radius -= event.mouseWheelScroll.delta / 5.0f;\r
+      }\r
+    }\r
+\r
+    int mouseDeltaX = sf::Mouse::getPosition(window).x - window.getSize().x / 2;\r
+    int mouseDeltaY = sf::Mouse::getPosition(window).y - window.getSize().y / 2;\r
+\r
+    if (options.catchMouse) {\r
+      sf::Mouse::setPosition(sf::Vector2i(\r
+        window.getSize().x / 2,\r
+        window.getSize().y / 2\r
+      ), window);\r
+\r
+      if (options.freecam) {\r
+        freecam.mouseX += mouseDeltaX;\r
+        freecam.mouseY += mouseDeltaY;\r
+\r
+        camForward = glm::rotate(glm::vec3(0, 0, 1), freecam.mouseY / 500.0f, glm::vec3(1, 0, 0));\r
+        camForward = glm::rotate(camForward, -freecam.mouseX / 500.0f, glm::vec3(0, 1, 0));\r
+\r
+        if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)) {\r
+          camPos += camForward / 20.0f;\r
+        }\r
+        if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)) {\r
+          camPos -= camForward / 20.0f;\r
+        }\r
+        if (sf::Keyboard::isKeyPressed(sf::Keyboard::A)) {\r
+          glm::vec3 camLeft = glm::rotate(glm::vec3(0, 0, 1), -freecam.mouseX / 500.0f + glm::radians(90.0f), glm::vec3(0, 1, 0));\r
+          camPos += camLeft / 20.0f;\r
+        }\r
+        if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) {\r
+          glm::vec3 camRight = glm::rotate(glm::vec3(0, 0, 1), -freecam.mouseX / 500.0f - glm::radians(90.0f), glm::vec3(0, 1, 0));\r
+          camPos += camRight / 20.0f;\r
+        }\r
+      } else {\r
+        if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) {\r
+          arcball.mouseX += mouseDeltaX;\r
+          arcball.mouseY += mouseDeltaY;\r
         }\r
       }\r
     }\r
 \r
+\r
+\r
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\r
 \r
     glEnable(GL_DEPTH_TEST);\r
 \r
-    if (wireframe)\r
+    if (options.wireframe)\r
       glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);\r
     else\r
       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\r
 \r
     glUseProgram(shaderProgram);\r
 \r
-    model = glm::rotate(model, glm::radians(0.2f), glm::vec3(0.0f, 1.0f, 0.0f));\r
+    //rotate\r
+    //model = glm::rotate(model, glm::radians(0.2f), glm::vec3(0.0f, 1.0f, 0.0f));\r
+\r
+    if (options.freecam) {\r
+      view = glm::lookAt(camPos, camPos + camForward, camUp);\r
+    } else {\r
+      float angle = arcball.mouseY / 200.0f;\r
+      if (angle > glm::radians(89.0f)) {\r
+        angle = glm::radians(89.0f);\r
+        arcball.mouseY = angle * 200.0f;\r
+      }\r
+      if (angle < glm::radians(-89.0f)) {\r
+        angle = glm::radians(-89.0f);\r
+        arcball.mouseY = angle * 200.0f;\r
+      }\r
+      arcball.camX = sin(angle) * exp(options.radius);\r
+      arcball.camZ = cos(angle) * exp(options.radius);\r
+      view = glm::lookAt(glm::vec3(0.0, arcball.camX, arcball.camZ), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0));\r
+      view = glm::rotate(view, arcball.mouseX / 100.0f, glm::vec3(0, 1, 0));\r
+    }\r
 \r
     glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "model"), 1,\r
                        GL_FALSE, glm::value_ptr(model));\r
@@ -249,6 +347,26 @@ int main() {
     glBindVertexArray(VAO);\r
     glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);\r
     glBindVertexArray(0);\r
+    \r
+    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\r
+\r
+    ImGui::SFML::Update(window, deltaClock.restart());\r
+\r
+    ImGui::Begin("Options");\r
+    ImGui::LabelText("Cursor Locked", "%d", options.catchMouse);\r
+    ImGui::Checkbox("Wireframe", &options.wireframe);\r
+    ImGui::Checkbox("Free Cam", &options.freecam);\r
+    if (options.freecam) {\r
+      ImGui::LabelText("Position", "%f %f %f", camPos.x, camPos.y, camPos.z);\r
+      ImGui::LabelText("Forward", "%f %f %f", camForward.x, camForward.y, camForward.z);\r
+      ImGui::LabelText("Mouse", "%d %d", freecam.mouseX, freecam.mouseY);\r
+    } else {\r
+      ImGui::LabelText("Rotation", "%f %f", arcball.camX, arcball.camZ);\r
+      ImGui::InputFloat("Radius", &options.radius);\r
+    }\r
+    ImGui::End();\r
+\r
+    ImGui::SFML::Render(window);\r
 \r
     window.display();\r
   }\r