main.cpp
#include <iostream>
#include <stdlib.h>
#include <vector>
#include <string>
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <math.h>
#include <learnopengl/shader_m.h>
#include <learnopengl/camera.h>
#include <learnopengl/model.h>
#define PI 3.14159265
#include <iostream>
#define STB_IMAGE_IMPLEMENTATION
#include <stb_image.h>
#include "SkinnedMesh.h"
#include "SkinningTechnique.h"
#include "math_3d.h"
void RenderScene(SkinningTechnique*& m_pEffect, SkinnedMesh& m_mesh, GLFWwindow*& window);
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void mouse_callback(GLFWwindow* window, double xpos, double ypos);
void scroll_callback(GLFWwindow* window, double xoffset, double yoffset);
void processInput(GLFWwindow* window);
const unsigned int SCR_WIDTH = 1920; //纹理图大小,分辨率越大,从纹理中采样出来得到的结果越清晰,锯齿越少。
const unsigned int SCR_HEIGHT = 1080;
// camera
Camera camera(glm::vec3(0.0f, 3.0f, -1.0f));
float lastX = SCR_WIDTH / 2.0f;
float lastY = SCR_HEIGHT / 2.0f;
bool firstMouse = true;
// timing
float deltaTime = 0.0f;
float lastFrame = 0.0f;
float time_start = 0.0f;
int main()
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
int count = 2;
// glfw window creation
// --------------------
GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
//glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
glfwSetCursorPosCallback(window, mouse_callback);
glfwSetScrollCallback(window, scroll_callback);
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
glEnable(GL_DEPTH_TEST);
SkinningTechnique* m_pEffect = new SkinningTechnique();
const char* vertexShader = "./shaders/myskinning.vs";
const char* fragmentShader = "./shaders/myskinning.fs";
m_pEffect->Init(vertexShader, fragmentShader);
glUseProgram(m_pEffect->m_shaderProg); // bind shader programme
SkinnedMesh m_mesh;
// LoadMesh
if (!m_mesh.LoadMesh("../Content/boblampclean.md5mesh")) {
cout << "Mesh load failed" << endl;
return false;
};
glViewport(0, 0, SCR_WIDTH, SCR_HEIGHT);
while (!glfwWindowShouldClose(window))
{
RenderScene(m_pEffect, m_mesh, window);
}
}
void RenderScene(SkinningTechnique* &m_pEffect, SkinnedMesh & m_mesh, GLFWwindow* &window)
{
glUseProgram(m_pEffect->m_shaderProg); // bind shader programme
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
vector<Matrix4f> Transforms;
float RunningTime = glfwGetTime() - time_start;
m_mesh.BoneTransform(RunningTime, Transforms);
for (uint i = 0; i < Transforms.size(); i++)
{
m_pEffect->SetBoneTransform(i, Transforms[i]);
}
glEnable(GL_DEPTH_TEST);
glClearColor(0.05f, 0.05f, 0.05f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f);
//glm::mat4 view = camera.GetViewMatrix();
glm::mat4 view = glm::lookAt(glm::vec3(0.0f, 0.0f, 5.0f),
glm::vec3(0.0f, 0.0f, 0.0f),
glm::vec3(0.0f, 1.0f, 0.0f));
glUniformMatrix4fv(glGetUniformLocation(m_pEffect->m_shaderProg, "projection"), 1, GL_FALSE, &projection[0][0]);
glUniformMatrix4fv(glGetUniformLocation(m_pEffect->m_shaderProg, "view"), 1, GL_FALSE, &view[0][0]);
//float angle = i;
glm::mat4 model = glm::mat4(1.0f);
model = glm::translate(model, glm::vec3(0.0f, -1.2f, 0.0f));
model = glm::rotate(model, glm::radians(-90.0f), glm::vec3(1.0, 0.0, 0.0));
model = glm::scale(model, glm::vec3(0.04f, 0.04f, 0.04f));
glUniformMatrix4fv(glGetUniformLocation(m_pEffect->m_shaderProg, "model"), 1, GL_FALSE, &model[0][0]);
m_mesh.Render(); // draw call
glfwSwapBuffers(window);
glfwPollEvents();
}
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
void mouse_callback(GLFWwindow* window, double xpos, double ypos)
{
if (firstMouse)
{
lastX = xpos;
lastY = ypos;
firstMouse = false;
}
float xoffset = xpos - lastX;
float yoffset = lastY - ypos; // reversed since y-coordinates go from bottom to top
lastX = xpos;
lastY = ypos;
camera.ProcessMouseMovement(xoffset, yoffset);
}
void scroll_callback(GLFWwindow* window, double xoffset, double yoffset)
{
camera.ProcessMouseScroll(yoffset);
}
void processInput(GLFWwindow* window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS)
camera.ProcessKeyboard(FORWARD, deltaTime);
if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS)
camera.ProcessKeyboard(BACKWARD, deltaTime);
if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)
camera.ProcessKeyboard(LEFT, deltaTime);
if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS