update
This commit is contained in:
parent
7e7b795fac
commit
f2815b796a
@ -58,6 +58,10 @@ static void key_callback(GLFWwindow* window, int key, int scancode, int action,
|
|||||||
Application::instance().KeyCallback(window, key, scancode, action, mods);
|
Application::instance().KeyCallback(window, key, scancode, action, mods);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void cursor_callback(GLFWwindow* window, double x, double y) {
|
||||||
|
Application::instance().CursorCallback(window, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
static void mouse_button_callback(GLFWwindow* window, int button, int action,
|
static void mouse_button_callback(GLFWwindow* window, int button, int action,
|
||||||
int mods) {
|
int mods) {
|
||||||
Application::instance().MouseButtonCallback(window, button, action, mods);
|
Application::instance().MouseButtonCallback(window, button, action, mods);
|
||||||
@ -120,6 +124,7 @@ void Application::init() {
|
|||||||
std::cout << "Failed to load icon.png" << std::endl;
|
std::cout << "Failed to load icon.png" << std::endl;
|
||||||
|
|
||||||
glfwSetMouseButtonCallback(window, mouse_button_callback);
|
glfwSetMouseButtonCallback(window, mouse_button_callback);
|
||||||
|
glfwSetCursorPosCallback(window, cursor_callback);
|
||||||
glfwSetScrollCallback(window, scroll_callback);
|
glfwSetScrollCallback(window, scroll_callback);
|
||||||
glfwSetKeyCallback(window, key_callback);
|
glfwSetKeyCallback(window, key_callback);
|
||||||
glfwSetCharCallback(window, char_callback);
|
glfwSetCharCallback(window, char_callback);
|
||||||
@ -128,6 +133,8 @@ void Application::init() {
|
|||||||
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
|
glfwGetCursorPos(window, &lastMouseX, &lastMouseY);
|
||||||
|
|
||||||
std::cout << "OpenGL version: " << glGetString(GL_VERSION) << std::endl;
|
std::cout << "OpenGL version: " << glGetString(GL_VERSION) << std::endl;
|
||||||
std::cout << "GLSL version: " << glGetString(GL_SHADING_LANGUAGE_VERSION)
|
std::cout << "GLSL version: " << glGetString(GL_SHADING_LANGUAGE_VERSION)
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
@ -178,7 +185,9 @@ void Application::KeyCallback(GLFWwindow* window, int key, int scancode,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void Application::CursorCallback(GLFWwindow* window, double x, double y) {
|
||||||
|
|
||||||
|
}
|
||||||
void Application::MouseButtonCallback(GLFWwindow* window, int button,
|
void Application::MouseButtonCallback(GLFWwindow* window, int button,
|
||||||
int action, int mods) {
|
int action, int mods) {
|
||||||
ImGui_ImplGlfwGL3_MouseButtonCallback(window, button, action, mods);
|
ImGui_ImplGlfwGL3_MouseButtonCallback(window, button, action, mods);
|
||||||
@ -258,7 +267,7 @@ bool Application::bindVertexAttrib(GLuint id, GLint loc, GLuint size) {
|
|||||||
size,// size
|
size,// size
|
||||||
GL_FLOAT,// type
|
GL_FLOAT,// type
|
||||||
GL_FALSE,// normalized?
|
GL_FALSE,// normalized?
|
||||||
0,// stride
|
0, // stride
|
||||||
(void* ) 0// array buffer offset
|
(void* ) 0// array buffer offset
|
||||||
))
|
))
|
||||||
return true;
|
return true;
|
||||||
@ -441,16 +450,26 @@ void Application::prepareShader() {
|
|||||||
glm::mat4 view;
|
glm::mat4 view;
|
||||||
|
|
||||||
if (fpsMode) {
|
if (fpsMode) {
|
||||||
|
glm::mat4 fpsTrafoInv = glm::inverse(fpsTrafo);
|
||||||
|
|
||||||
glm::vec4 movement(0.0);
|
glm::vec4 movement(0.0);
|
||||||
if (fpsMode) {
|
if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) {
|
||||||
if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) {
|
movement += glm::vec4(0.0, 0.0, 0.1, 0.0);
|
||||||
movement += glm::vec4(0.0, 0.0, 0.1, 0.0);
|
} else if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) {
|
||||||
} else if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) {
|
movement -= glm::vec4(0.0, 0.0, 0.1, 0.0);
|
||||||
movement -= glm::vec4(0.0, 0.0, 0.1, 0.0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
glm::vec3 absolute = glm::transpose(fpsTrafo) * movement;
|
double mouseX, mouseY;
|
||||||
|
glfwGetCursorPos(window, &mouseX, &mouseY);
|
||||||
|
glm::vec3 up = fpsTrafoInv * glm::vec4(0.0, 1.0, 0.0, 0.0);
|
||||||
|
glm::vec3 side = fpsTrafoInv * glm::vec4(1.0, 0.0, 0.0, 0.0);
|
||||||
|
glm::vec3 front = fpsTrafoInv * glm::vec4(0.0, 0.0, 1.0, 0.0);
|
||||||
|
fpsTrafo = glm::rotate(fpsTrafo, (float)(mouseX - lastMouseX) * 0.01f, up);
|
||||||
|
fpsTrafo = glm::rotate(fpsTrafo, (float)(mouseY - lastMouseY) * 0.01f, side);
|
||||||
|
//fpsTrafo = glm::rotate(fpsTrafo, mouseX - lastMouseX, up);
|
||||||
|
glm::vec3 absolute = fpsTrafoInv * movement;
|
||||||
fpsTrafo = glm::translate(fpsTrafo, absolute);
|
fpsTrafo = glm::translate(fpsTrafo, absolute);
|
||||||
|
lastMouseX = mouseX;
|
||||||
|
lastMouseY = mouseY;
|
||||||
view = fpsTrafo;
|
view = fpsTrafo;
|
||||||
} else {
|
} else {
|
||||||
model = glm::rotate(model, (float) glfwGetTime(), vec3(0.f, 1.f, 0.f));
|
model = glm::rotate(model, (float) glfwGetTime(), vec3(0.f, 1.f, 0.f));
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
|
||||||
struct GLFWwindow;
|
struct GLFWwindow;
|
||||||
|
|
||||||
class Application {
|
class Application {
|
||||||
@ -47,6 +46,7 @@ class Application {
|
|||||||
|
|
||||||
glm::mat4 fpsTrafo;
|
glm::mat4 fpsTrafo;
|
||||||
bool fpsMode;
|
bool fpsMode;
|
||||||
|
double lastMouseX, lastMouseY;
|
||||||
|
|
||||||
void toogleFpsMode();
|
void toogleFpsMode();
|
||||||
public:
|
public:
|
||||||
@ -62,6 +62,7 @@ public:
|
|||||||
|
|
||||||
void KeyCallback(GLFWwindow* window, int key, int scancode, int action,
|
void KeyCallback(GLFWwindow* window, int key, int scancode, int action,
|
||||||
int mods);
|
int mods);
|
||||||
|
void CursorCallback(GLFWwindow* window, double x, double y);
|
||||||
void MouseButtonCallback(GLFWwindow* window, int button, int action,
|
void MouseButtonCallback(GLFWwindow* window, int button, int action,
|
||||||
int mods);
|
int mods);
|
||||||
void ScrollCallback(GLFWwindow* window, double xoffset, double yoffset);
|
void ScrollCallback(GLFWwindow* window, double xoffset, double yoffset);
|
||||||
|
27
src/Mesh.cpp
27
src/Mesh.cpp
@ -7,14 +7,12 @@
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace glm;
|
using namespace glm;
|
||||||
|
|
||||||
void calculateNormals(const vector<vec3> &vtx, vector<uvec3> &tri,
|
void calculateNormals(const vec3v_t &vtx, uvec3v_t &tri, vec3v_t &normals) {
|
||||||
vector<vec3> &normals) {
|
|
||||||
normals.clear();
|
normals.clear();
|
||||||
normals.resize(vtx.size(), vec3(0));
|
normals.resize(vtx.size(), vec3(0));
|
||||||
for (size_t i = 0; i < tri.size(); i++) {
|
for (size_t i = 0; i < tri.size(); i++) {
|
||||||
int a = tri[i].x, b = tri[i].y, c = tri[i].z;
|
int a = tri[i].x, b = tri[i].y, c = tri[i].z;
|
||||||
vec3 faceNormal = normalize(
|
vec3 faceNormal = normalize(cross(vtx[b] - vtx[a], vtx[c] - vtx[a]));
|
||||||
cross(vtx[b] - vtx[a], vtx[c] - vtx[a]));
|
|
||||||
normals[a] += faceNormal;
|
normals[a] += faceNormal;
|
||||||
normals[b] += faceNormal;
|
normals[b] += faceNormal;
|
||||||
normals[c] += faceNormal;
|
normals[c] += faceNormal;
|
||||||
@ -24,7 +22,7 @@ void calculateNormals(const vector<vec3> &vtx, vector<uvec3> &tri,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void moveToMean(vector<vec3> &vtx) {
|
void moveToMean(vec3v_t &vtx) {
|
||||||
vec3 mean(0);
|
vec3 mean(0);
|
||||||
for (size_t i = 0; i < vtx.size(); i++) {
|
for (size_t i = 0; i < vtx.size(); i++) {
|
||||||
mean += vtx[i];
|
mean += vtx[i];
|
||||||
@ -35,8 +33,8 @@ void moveToMean(vector<vec3> &vtx) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void smooth(vector<vec3> &vtx, const vector<uvec3> &tri) {
|
void smooth(vec3v_t &vtx, const uvec3v_t &tri) {
|
||||||
vector<vec3> cogs(vtx.size(), vec3(0.f));
|
vec3v_t cogs(vtx.size(), vec3(0.f));
|
||||||
vector<int> valence(vtx.size(), 0);
|
vector<int> valence(vtx.size(), 0);
|
||||||
|
|
||||||
for (size_t iTri = 0; iTri < tri.size(); iTri++) {
|
for (size_t iTri = 0; iTri < tri.size(); iTri++) {
|
||||||
@ -70,21 +68,20 @@ void smooth(vector<vec3> &vtx, const vector<uvec3> &tri) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void saveAttrib(std::ostream &out, const char *prefix, vector<vec3> &elements) {
|
void saveAttrib(std::ostream &out, const char *prefix, vec3v_t &elements) {
|
||||||
for (size_t i = 0; i < elements.size(); i++) {
|
for (size_t i = 0; i < elements.size(); i++) {
|
||||||
out << prefix << elements[i].x << " " << elements[i].y << " "
|
out << prefix << elements[i].x << " " << elements[i].y << " "
|
||||||
<< elements[i].z << "\n";
|
<< elements[i].z << "\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void saveAttrib(std::ostream &out, const char *prefix,
|
void saveAttrib(std::ostream &out, const char *prefix, vec2v_t &elements) {
|
||||||
vector<vec2> &elements) {
|
|
||||||
for (size_t i = 0; i < elements.size(); i++) {
|
for (size_t i = 0; i < elements.size(); i++) {
|
||||||
out << prefix << elements[i].x << " " << elements[i].y << "\n";
|
out << prefix << elements[i].x << " " << elements[i].y << "\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void saveFaces(std::ostream &out, const vector<uvec3> &tris, size_t attribs) {
|
void saveFaces(std::ostream &out, const uvec3v_t &tris, size_t attribs) {
|
||||||
for (size_t i = 0; i < tris.size(); i++) {
|
for (size_t i = 0; i < tris.size(); i++) {
|
||||||
out << "f";
|
out << "f";
|
||||||
|
|
||||||
@ -102,8 +99,7 @@ void saveFaces(std::ostream &out, const vector<uvec3> &tris, size_t attribs) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void calculateEdges(const vector<vec3> &vtx, vector<uvec3> &tri,
|
void findEdges(const vec3v_t &vtx, uvec3v_t &tri, uvec4v_t &edges) {
|
||||||
vector<uvec4> &edges) {
|
|
||||||
edges.clear();
|
edges.clear();
|
||||||
map<pair<uint32_t, uint32_t>, uint32_t> edgeMap;
|
map<pair<uint32_t, uint32_t>, uint32_t> edgeMap;
|
||||||
for (size_t iTri = 0; iTri < tri.size(); iTri++) {
|
for (size_t iTri = 0; iTri < tri.size(); iTri++) {
|
||||||
@ -122,9 +118,8 @@ void calculateEdges(const vector<vec3> &vtx, vector<uvec3> &tri,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void computeTangentBasis(vector<vec3> & vertices, vector<vec2> & uvs,
|
void computeTangentBasis(vec3v_t & vertices, vec2v_t & uvs, vec3v_t & normals,
|
||||||
vector<vec3> & normals, vector<vec3> & tangents,
|
vec3v_t & tangents, vec3v_t & bitangents) {
|
||||||
vector<vec3> & bitangents) {
|
|
||||||
|
|
||||||
for (size_t i = 0; i < vertices.size(); i += 3) {
|
for (size_t i = 0; i < vertices.size(); i += 3) {
|
||||||
|
|
||||||
|
28
src/Mesh.h
28
src/Mesh.h
@ -6,25 +6,23 @@
|
|||||||
#include <glm/vec3.hpp>
|
#include <glm/vec3.hpp>
|
||||||
#include <glm/vec4.hpp>
|
#include <glm/vec4.hpp>
|
||||||
|
|
||||||
void calculateNormals(const std::vector<glm::vec3> &vtx,
|
typedef std::vector<glm::vec3> vec3v_t;
|
||||||
std::vector<glm::uvec3> &tri, std::vector<glm::vec3> &normals);
|
typedef std::vector<glm::vec2> vec2v_t;
|
||||||
|
typedef std::vector<glm::uvec3> uvec3v_t;
|
||||||
|
typedef std::vector<glm::uvec4> uvec4v_t;
|
||||||
|
|
||||||
void moveToMean(std::vector<glm::vec3> &vtx);
|
void calculateNormals(const vec3v_t &vtx, uvec3v_t &tri, vec3v_t &normals);
|
||||||
|
void findEdges(const vec3v_t &vtx, uvec3v_t &tri, uvec4v_t &edges);
|
||||||
|
|
||||||
void smooth(std::vector<glm::vec3> &vtx, const std::vector<glm::uvec3> &tri);
|
void moveToMean(vec3v_t &vtx);
|
||||||
|
|
||||||
void saveAttrib(std::ostream &out, const char *prefix,
|
void smooth(vec3v_t &vtx, const uvec3v_t &tri);
|
||||||
std::vector<glm::vec3> &elements);
|
|
||||||
|
|
||||||
void saveAttrib(std::ostream &out, const char *prefix,
|
void saveAttrib(std::ostream &out, const char *prefix, vec3v_t &elements);
|
||||||
std::vector<glm::vec2> &elements);
|
|
||||||
|
|
||||||
void saveFaces(std::ostream &out, const std::vector<glm::uvec3> &tris,
|
void saveAttrib(std::ostream &out, const char *prefix, vec2v_t &elements);
|
||||||
size_t attribs);
|
|
||||||
|
|
||||||
void calculateEdges(const std::vector<glm::vec3> &vtx,
|
void saveFaces(std::ostream &out, const uvec3v_t &tris, size_t attribs);
|
||||||
std::vector<glm::uvec3> &tri, std::vector<glm::uvec4> &edges);
|
|
||||||
|
|
||||||
void computeTangentBasis(std::vector<glm::vec3> & vertices,
|
void computeTangentBasis(vec3v_t & vertices, vec2v_t & uvs, vec3v_t & normals,
|
||||||
std::vector<glm::vec2> & uvs, std::vector<glm::vec3> & normals,
|
vec3v_t & tangents, vec3v_t & bitangents);
|
||||||
std::vector<glm::vec3> & tangents, std::vector<glm::vec3> & bitangents);
|
|
||||||
|
7187
vendor/stb_image.h
vendored
Normal file
7187
vendor/stb_image.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5
vendor/stb_impl.cpp
vendored
Normal file
5
vendor/stb_impl.cpp
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
#define STB_IMAGE_IMPLEMENTATION
|
||||||
|
#include <stb_image.h>
|
||||||
|
|
||||||
|
#define STB_IMAGE_WRITE_IMPLEMENTATION
|
||||||
|
#include "stb_image_write.h"
|
Loading…
Reference in New Issue
Block a user