181 lines
6.9 KiB
C++
181 lines
6.9 KiB
C++
|
#if 1
|
||
|
#include <Windows.h>
|
||
|
|
||
|
#include <iostream>
|
||
|
|
||
|
|
||
|
#include <glm/glm.hpp>
|
||
|
#include <glm/ext.hpp>
|
||
|
#include <stb/stb_image.h>
|
||
|
|
||
|
#include "Core/Logger.h"
|
||
|
#include "Ipc/IpcMoudle.h"
|
||
|
#include "shader_s.h"
|
||
|
|
||
|
|
||
|
static int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) {
|
||
|
Logger::Init();
|
||
|
IpcMoudle::Init();
|
||
|
auto glfwErrorCallback = [](int error, const char* description) {
|
||
|
ERRORLOG("code={}, description={}", error, description);
|
||
|
};
|
||
|
|
||
|
glfwSetErrorCallback(glfwErrorCallback);
|
||
|
|
||
|
if (GLFW_TRUE != glfwInit()) {
|
||
|
return -1; //exit(EXIT_FAILURE);
|
||
|
}
|
||
|
|
||
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
|
||
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 4);
|
||
|
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||
|
glfwWindowHint(GLFW_SAMPLES, 4);
|
||
|
if (true) {
|
||
|
glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE);
|
||
|
}
|
||
|
|
||
|
glfwWindowHint(GLFW_RESIZABLE, true);
|
||
|
glfwWindowHint(GLFW_DECORATED, true);
|
||
|
glfwWindowHint(GLFW_FOCUSED, true);
|
||
|
glfwWindowHint(GLFW_MAXIMIZED, false);
|
||
|
glfwWindowHint(GLFW_FLOATING, false);
|
||
|
glfwWindowHint(GLFW_VISIBLE, true);
|
||
|
glfwWindowHint(GLFW_AUTO_ICONIFY, true);
|
||
|
//glfwWindowHint(GLFW_REFRESH_RATE, settings.refreshRate);
|
||
|
glfwWindowHint(GLFW_SAMPLES, 4);
|
||
|
|
||
|
GLFWwindow* window = glfwCreateWindow(860, 540, "humanRender", nullptr, nullptr);
|
||
|
if (!window) {
|
||
|
ERRORLOG("glfwCreateWindow failed");
|
||
|
glfwTerminate();
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
glfwSetKeyCallback(window, [](GLFWwindow* window, int key, int scancode, int action, int mods) {
|
||
|
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
|
||
|
glfwSetWindowShouldClose(window, GLFW_TRUE);
|
||
|
}
|
||
|
);
|
||
|
|
||
|
glfwMakeContextCurrent(window);
|
||
|
glewExperimental = GL_TRUE;
|
||
|
GLenum err = glewInit();
|
||
|
if (GLEW_OK != err) {
|
||
|
const GLubyte* errorString = glewGetErrorString(err);
|
||
|
ERRORLOG("glewInit={1}, err={2}", err, reinterpret_cast<const char*>(errorString));
|
||
|
glfwDestroyWindow(window);
|
||
|
glfwTerminate();
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
glfwSwapInterval(1);
|
||
|
|
||
|
|
||
|
float vertices[] = {
|
||
|
// positions // colors // texture coords
|
||
|
1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, // top right
|
||
|
1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // bottom right
|
||
|
-1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // bottom left
|
||
|
-1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f // top left
|
||
|
};
|
||
|
unsigned int indices[] = {
|
||
|
0, 1, 3, // first triangle
|
||
|
1, 2, 3 // second triangle
|
||
|
};
|
||
|
unsigned int VBO, VAO, EBO;
|
||
|
glGenVertexArrays(1, &VAO);
|
||
|
glGenBuffers(1, &VBO);
|
||
|
glGenBuffers(1, &EBO);
|
||
|
// bind the Vertex Array Object first, then bind and set vertex buffer(s), and then configure vertex attributes(s).
|
||
|
glBindVertexArray(VAO);
|
||
|
|
||
|
glBindBuffer(GL_ARRAY_BUFFER, VBO);
|
||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
||
|
|
||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
|
||
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
|
||
|
|
||
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
|
||
|
glEnableVertexAttribArray(0);
|
||
|
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3* sizeof(float)));
|
||
|
glEnableVertexAttribArray(1);
|
||
|
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
|
||
|
glEnableVertexAttribArray(2);
|
||
|
|
||
|
// note that this is allowed, the call to glVertexAttribPointer registered VBO as the vertex attribute's bound vertex buffer object so afterwards we can safely unbind
|
||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||
|
|
||
|
// remember: do NOT unbind the EBO while a VAO is active as the bound element buffer object IS stored in the VAO; keep the EBO bound.
|
||
|
//glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||
|
|
||
|
// You can unbind the VAO afterwards so other VAO calls won't accidentally modify this VAO, but this rarely happens. Modifying other
|
||
|
// VAOs requires a call to glBindVertexArray anyways so we generally don't unbind VAOs (nor VBOs) when it's not directly necessary.
|
||
|
glBindVertexArray(0);
|
||
|
|
||
|
unsigned int texture;
|
||
|
glGenTextures(1, &texture);
|
||
|
glBindTexture(GL_TEXTURE_2D, texture); // all upcoming GL_TEXTURE_2D operations now have effect on this texture object
|
||
|
// set the texture wrapping parameters
|
||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // set texture wrapping to GL_REPEAT (default wrapping method)
|
||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||
|
// set texture filtering parameters
|
||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||
|
// load image, create texture and generate mipmaps
|
||
|
int width, height, nrChannels;
|
||
|
// The FileSystem::getPath(...) is part of the GitHub repository so we can find files on any IDE/platform; replace it with your own image path.
|
||
|
stbi_set_flip_vertically_on_load(true);
|
||
|
unsigned char* data = stbi_load("./data/background/background.jpg", &width, &height, &nrChannels, 0);
|
||
|
if (data) {
|
||
|
if (nrChannels == 3) {
|
||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
|
||
|
} else if (nrChannels == 4) {
|
||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
|
||
|
}
|
||
|
glGenerateMipmap(GL_TEXTURE_2D);
|
||
|
} else {
|
||
|
std::cout << "Failed to load texture" << std::endl;
|
||
|
}
|
||
|
stbi_image_free(data);
|
||
|
|
||
|
Shader shader("./data/shader/texture.vs", "./data/shader/texture.fs");
|
||
|
|
||
|
while (!glfwWindowShouldClose(window)) {
|
||
|
|
||
|
float ratio;
|
||
|
glm::mat4 model, view, projection, mvp;
|
||
|
int width = 0;
|
||
|
int height = 0;
|
||
|
glfwGetFramebufferSize(window, &width, &height);
|
||
|
height = height == 0 ? 1 : height;
|
||
|
|
||
|
ratio = width / (float)height;
|
||
|
glViewport(0, 0, width, height);
|
||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||
|
glClearColor(49.f / 255, 77.f / 255, 121.f / 255, 1.f);
|
||
|
view = glm::lookAt(glm::vec3(0, 0, 10), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0));
|
||
|
projection = glm::perspective(glm::radians(60.f), ratio, 1.f, 1000.f);
|
||
|
|
||
|
glBindTexture(GL_TEXTURE_2D, texture);
|
||
|
shader.use();
|
||
|
|
||
|
glBindVertexArray(VAO);
|
||
|
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
|
||
|
|
||
|
glfwSwapBuffers(window);
|
||
|
glfwPollEvents();
|
||
|
}
|
||
|
|
||
|
glBindVertexArray(VAO); // seeing as we only have a single VAO there's no need to bind it every time, but we'll do so to keep things a bit more organized
|
||
|
//glDrawArrays(GL_TRIANGLES, 0, 6);
|
||
|
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
|
||
|
|
||
|
glfwDestroyWindow(window);
|
||
|
glfwTerminate();
|
||
|
|
||
|
IpcMoudle::Shotdown();
|
||
|
Logger::Shotdown();
|
||
|
return 0;
|
||
|
}
|
||
|
#endif
|