aboutsummaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2020-02-14 17:09:48 +0100
committerdec05eba <dec05eba@protonmail.com>2021-11-18 15:22:10 +0100
commitb366f3d0c573468ecd0b59da43dfcbc847334b19 (patch)
tree543a781260fc23197e301c6e2e42107a0a914027 /src/main.cpp
parent83c78e2b5cc9b0cb737ec3785722ae280bd29b65 (diff)
Add obj parser
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp45
1 files changed, 39 insertions, 6 deletions
diff --git a/src/main.cpp b/src/main.cpp
index c073a43..6f825b1 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -5,6 +5,8 @@
#include "../include/RenderBackend/OpenGL/DeviceFrame.hpp"
#include "../include/Triangle.hpp"
+#include "../include/model_loader/ObjModelLoader.hpp"
+
#include <cstdio>
#include <chrono>
@@ -21,6 +23,10 @@ static GLFWwindow *createWindow();
static std::unique_ptr<Shader> load_shader_from_file(const char *filepath, Shader::Type shader_type);
static std::unique_ptr<ShaderProgram> build_shader_program_from_shaders(const std::vector<Shader*> &shaders);
+struct Userdata {
+ float cam_dist;
+};
+
int main()
{
initGlfw();
@@ -44,7 +50,10 @@ int main()
Vertex3D(0.0f, 1.0f, 0.0f)
),
};
- DataView<Triangle3D> cpuTriangles(cpuTriangle.data(), cpuTriangle.size());
+ //DataView<Triangle3D> cpuTriangles(cpuTriangle.data(), cpuTriangle.size());
+ std::vector<Triangle3D> triangles;
+ ObjModelLoader::load_from_file("/home/dec05eba/Downloads/FinalBaseMesh.obj", triangles);
+ DataView<Triangle3D> cpuTriangles(triangles.data(), triangles.size());
DeviceMemory *gpuTriangle = frame.alloc();
gpuTriangle->copy(cpuTriangles, DeviceMemory::StorageType::STATIC);
@@ -64,9 +73,19 @@ int main()
Result<Uniform> view_uniform = shader_program->get_uniform_by_name("view");
Result<Uniform> model_uniform = shader_program->get_uniform_by_name("model");
- glm::vec3 character_pos(0.0f, 3.0f, 3.0f);
+ Userdata userdata;
+ userdata.cam_dist = 3.0f;
+ glm::vec3 character_pos(0.0f, 0.0f, userdata.cam_dist);
auto t_start = std::chrono::high_resolution_clock::now();
+
+ glfwSetWindowUserPointer(window, &userdata);
+
+ glfwSetScrollCallback(window, [](GLFWwindow *window, double xoffset, double yoffset){
+ Userdata *userdata = (Userdata*)glfwGetWindowUserPointer(window);
+ userdata->cam_dist += yoffset;
+ });
+ //glEnable(GL_CULL_FACE);
while(!glfwWindowShouldClose(window)) {
glfwPollEvents();
if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
@@ -76,10 +95,17 @@ int main()
float time_delta = std::chrono::duration_cast<std::chrono::duration<float>>(t_now - t_start).count();
t_start = t_now;
+ float move_speed = time_delta * 3.0f;
if(glfwGetKey(window, GLFW_KEY_W))
- character_pos.y -= time_delta;
+ character_pos.y -= move_speed;
if(glfwGetKey(window, GLFW_KEY_S))
- character_pos.y += time_delta;
+ character_pos.y += move_speed;
+ if(glfwGetKey(window, GLFW_KEY_A))
+ character_pos.x += move_speed;
+ if(glfwGetKey(window, GLFW_KEY_D))
+ character_pos.x -= move_speed;
+
+ character_pos.z = userdata.cam_dist;
glm::mat4 view = glm::lookAt(
character_pos,
@@ -100,7 +126,9 @@ int main()
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
// Do the actual screen clearing, using the color set using glClearColor
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
frame.draw(shader_program.get());
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glfwSwapBuffers(window);
}
@@ -121,7 +149,7 @@ void initGlfw()
exit(-1);
}
- glfwWindowHint(GLFW_SAMPLES, 4);
+ glfwWindowHint(GLFW_SAMPLES, 4); // anti aliasing
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
@@ -138,7 +166,12 @@ void initGlew() {
}
}
+static void error_callback(int error, const char *description) {
+ fprintf(stderr, "Opengl error: %s (%d)\n", description, error);
+}
+
GLFWwindow* createWindow() {
+ glfwSetErrorCallback(error_callback);
GLFWwindow *window = glfwCreateWindow(1280, 720, "Amalgine", nullptr, nullptr);
if(!window)
{
@@ -149,7 +182,7 @@ GLFWwindow* createWindow() {
glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_FALSE);
glfwMakeContextCurrent(window);
- glfwSwapInterval(0);
+ glfwSwapInterval(1); // 1 = enable vsync
initGlew();
return window;
}